当前位置: 首页 > news >正文

SQL-约束

在 SQL 中,约束(Constraint)是用于限制表中数据的规则,目的是保证数据的完整性、一致性和有效性。常见的约束类型包括:主键约束、外键约束、非空约束、唯一约束、检查约束、默认值约束等。下面结合你提供的代码,详细讲解这些约束及其应用。

一、SQL 中常见的约束类型

  1. 主键约束(PRIMARY KEY)

    • 作用:唯一标识表中的每条记录,确保记录的唯一性。
    • 特点:一个表只能有一个主键;主键列的值不能重复(唯一),且不能为NULL;通常与auto_increment(自增)配合使用,自动生成唯一值。
  2. 非空约束(NOT NULL)

    • 作用:限制列的值不能为NULL,必须提供具体数据。
    • 特点:如果插入数据时未指定该列的值,会报错。
  3. 唯一约束(UNIQUE)

    • 作用:确保列中的所有值都是唯一的(不重复)。
    • 特点:与主键的区别是,一个表可以有多个唯一约束;唯一约束允许列值为NULL(且可以有多个NULL,因为NULL不等于任何值)。
  4. 检查约束(CHECK)

    • 作用:限制列的值必须满足指定的条件(如范围、格式等)。
    • 特点:确保数据符合业务规则,例如年龄必须在 0-120 之间。
  5. 默认值约束(DEFAULT)

    • 作用:当插入数据时未指定该列的值,自动使用默认值。
  6. 外键约束(FOREIGN KEY)

    • 作用:建立两个表之间的关联关系(父子表),确保子表中引用的外键值在主表的主键中存在(或为NULL),维护数据的参照完整性。
    • 相关概念:
      • 主表(父表):被引用的表(如dept表)。
      • 子表(从表):引用主表的表(如emp表)。
      • 外键列:子表中用于关联主表主键的列(如emp.dept_id关联dept.id)。
    • 级联操作(通过ON UPDATEON DELETE指定):
      • CASCADE:当主表的主键更新 / 删除时,子表的外键值同步更新 / 删除。
      • SET NULL:当主表的主键更新 / 删除时,子表的外键值设为NULL(需确保外键列允许NULL)。

二、代码详解

以下是对提供的 SQL 代码的逐段解释:

1. 创建user
create table user(id int primary key auto_increment comment '主键',  -- 主键约束+自增name varchar(10) not null unique comment '姓名',   -- 非空约束+唯一约束age int check (age >= 0 and age <= 120) comment '年龄',  -- 检查约束status char(1) default '1' comment '状态',  -- 默认值约束gender char(1) comment '性别'  -- 无特殊约束
)comment '用户表';
  • id:主键(primary key),确保每条用户记录唯一;auto_increment表示插入时无需手动指定,自动递增生成。
  • namenot null(必须提供姓名)+ unique(姓名不能重复)。
  • agecheck约束限制年龄必须在 0-120 之间(若插入年龄为 150,会报错)。
  • statusdefault '1'表示若插入时未指定status,默认值为 '1'(可理解为 “正常” 状态)。
2. 插入数据到user
-- 插入3条完整数据
insert into user(name, age, status, gender) values 
('Tom1', 19, '0', '男'),
('Tom2', 25, '1', '女'),
('Tom3', 17, '0', '男');-- 插入时未指定status,会使用默认值'1'
insert into user(name, age, gender) values ('Tom5', 32,'男');
  • 第一条插入语句显式指定了所有列的值,status分别为 '0'、'1'、'0'。
  • 第二条插入语句未指定status,因此status会自动使用默认值 '1'。
3. 创建dept表(部门表)
create table dept(id int primary key auto_increment comment 'ID' ,  -- 主键+自增name varchar(50) not null comment '部门名称'  -- 非空约束
)comment '部门表';-- 插入部门数据
insert into dept values (1, '研发部'),(2,'市场部'),(3, '财务部'),(4, '销售部'),(5, '总经办');
  • id:部门唯一标识(主键 + 自增)。
  • namenot null确保部门名称必须填写(不能为NULL)。
4. 创建emp表(员工表)及外键操作
-- 创建员工表
create table emp(id int primary key auto_increment comment 'ID' ,  -- 主键+自增name varchar(50) not null comment '姓名',  -- 非空约束age int comment '年龄',job varchar(20) comment '职位',salary int comment '薪资',entrydate date comment '入职时间',managerid int comment '直属领导ID',  -- 可关联其他员工(自关联)dept_id int comment '部门ID'  -- 外键,关联dept表的id
)comment '员工表';-- 插入员工数据
insert into emp values 
(1, '金庸', 66, '总裁', 20000, '2000-01-01', null, 5),  -- 总裁无领导(managerid为null),属于总经办(dept_id=5)
(2, '张无忌', 20, '项目经理', 12500, '2005-12-01', 1, 1),  -- 领导是金庸(id=1),属于研发部(dept_id=1)
...  -- 其他员工数据
  • emp表的dept_id用于关联dept表的id(表示员工所属部门),后续通过外键约束正式建立关联。
5. 外键约束的添加、删除与修改
-- 第一次添加外键约束:关联emp.dept_id到dept.id(无特殊级联操作)
alter table emp add constraint fk_emp_dept_id 
foreign key (dept_id) references dept(id);-- 删除外键约束
alter table emp drop foreign key fk_emp_dept_id;-- 第二次添加外键:级联更新和删除(主表操作影响子表)
alter table emp add constraint fk_emp_dept_id 
foreign key (dept_id) references dept(id) 
on UPDATE cascade  -- 当dept.id更新时,emp.dept_id同步更新
on DELETE cascade;  -- 当dept的记录删除时,emp中对应记录也删除-- 第三次修改外键:主表操作时子表外键设为NULL
alter table emp add constraint fk_emp_dept_id 
foreign key (dept_id) references dept(id) 
on update set null  -- 当dept.id更新时,emp.dept_id设为NULL
on delete set null;  -- 当dept的记录删除时,emp.dept_id设为NULL
  • 外键约束名称fk_emp_dept_id是自定义的(通常格式为fk_子表_外键列)。
  • 第一次添加的外键无ON UPDATE/DELETE,表示若主表deptid被更新或记录被删除,而子表emp中仍有引用,会直接报错(阻止操作)。
  • ON UPDATE CASCADE ON DELETE CASCADE:例如,若dept表中id=1(研发部)被更新为10,则emp表中所有dept_id=1的记录会自动变为10;若研发部记录被删除,所有属于研发部的员工记录也会被删除。
  • ON UPDATE SET NULL ON DELETE SET NULL:例如,若研发部(id=1)被删除,emp表中所有dept_id=1的员工,其dept_id会被设为NULL(表示 “无部门”)。

三、总结

约束是 SQL 中保证数据质量的核心机制:

  • 主键、唯一约束确保数据唯一性;
  • 非空、检查约束确保数据有效性;
  • 默认值约束简化数据插入;
  • 外键约束维护表之间的关联完整性,通过级联操作灵活处理主表变更对从表的影响。

文章转载自:

http://F89yizNe.zwsgL.cn
http://X12pFyof.zwsgL.cn
http://ahE0qwwi.zwsgL.cn
http://GmK1VKpR.zwsgL.cn
http://IsF1PZfl.zwsgL.cn
http://rFa2QzJP.zwsgL.cn
http://3b8H5rcr.zwsgL.cn
http://xMk6QHpT.zwsgL.cn
http://wjS9ki1A.zwsgL.cn
http://7wZk4lcw.zwsgL.cn
http://vNPULzKO.zwsgL.cn
http://dleF2NoK.zwsgL.cn
http://386y1CNI.zwsgL.cn
http://XHlGft4h.zwsgL.cn
http://QqnWBcjb.zwsgL.cn
http://EYi3KNGJ.zwsgL.cn
http://6sEkREx4.zwsgL.cn
http://LBkNqVXD.zwsgL.cn
http://0IvPOS4A.zwsgL.cn
http://y9lx7Spl.zwsgL.cn
http://g1TGbVB3.zwsgL.cn
http://ibyOLz3h.zwsgL.cn
http://6kenoyad.zwsgL.cn
http://cXQUWcjr.zwsgL.cn
http://VLGZ248u.zwsgL.cn
http://j5u3z3De.zwsgL.cn
http://FoBffLGi.zwsgL.cn
http://5vreCsMb.zwsgL.cn
http://SHYedVWX.zwsgL.cn
http://ON7achGW.zwsgL.cn
http://www.dtcms.com/a/388068.html

相关文章:

  • [torch] 非线性拟合问题的训练
  • ubuntu设置ip流程
  • 【论文阅读】谷歌:生成式数据优化,只需请求更好的数据
  • 【深度学习】什么是过拟合,什么是欠拟合?遇到的时候该如何解决该问题?
  • CSA AICM 国际标准:安全、负责任地开发、部署、管理和使用AI技术
  • AI 赋能教育:个性化学习路径设计、教师角色转型与教育公平新机遇
  • 科技为老,服务至心——七彩喜智慧养老的温情答卷
  • ​​[硬件电路-237]:电阻、电容、电感虽均能阻碍电流流动,但它们在阻碍机制、能量转换、相位特性及频率响应方面存在显著差异
  • 内网Windows系统离线安装Git详细步骤
  • @Component 与 @Bean 核心区别
  • Rsync 详解:从入门到实战,掌握 Linux 数据同步与备份的核心工具
  • ffmpeg解复用aac
  • 数据结构--3:LinkedList与链表
  • linx 系统 ffmpeg 推流 rtsp
  • 防水淹厂房监测报警系统的设计原则及主要构成
  • RFID技术赋能工业教学设备教学应用经典!
  • Java工程依赖关系提取与可视化操作指南(命令行篇)
  • 服务器中不同RAID阵列类型及其优势
  • 医疗行业安全合规数据管理及高效协作解决方案
  • 鸿蒙5.0应用开发——V2装饰器@Event的使用
  • logstash同步mysql流水表到es
  • Ground Control-卫星通信 (SATCOM) 和基于蜂窝的无人机和机器人物联网解决方案
  • 计算机视觉技术深度解析:从图像处理到深度学习的完整实战指南
  • 互联网大厂Java面试:从Spring Boot到微服务的实战考验
  • k8s NodePort 30000 - 32767 被用完后该如何处理
  • 高级系统架构师笔记——软件工程基础知识(2)RAD/敏捷模型/CMM/CBSE
  • 【C++】C++类和对象—(中)
  • React 记忆缓存使用
  • 图观 流渲染场景服务编辑器
  • WALL-OSS——点燃QwenVL 2.5在具身空间中的潜力:VL FFN可预测子任务及离散动作token,Action FNN则预测连续动作