概述
- 含义:一种限制,用于限制表中的数据,为了保证表中数据的准确性和可靠性(即一致性)
- 分类:六大约束
not null
:非空,用于保证该字段的值不能为空(比如姓名、学号等)default
:默认,用于保证该字段有默认值(比如性别等)primary key
:主键,用于保证该字段的值具有唯一性,并且非空(比如学号、员工编号等)unique
:唯一,用于保证该字段的值具有唯一性,可以为空(比如座位号等)check
:检查约束,MySQL中不支持(不会报错,但是没效果),用于检查添加的数据是否符合条件(比如性别只能填写男或者女)foreign key
:外键约束,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值。在**从表添加外键约束**,用于引用主表中某列的值。(比如学生的专业编号,员工表的部门编号,员工表的工种编号等)
- 添加约束的时机:
- 创建表时
- 修改表时
- 总之就是要在添加数据之前添加约束
- 约束的添加分类:
- 列级约束:六大约束语法上都支持,但是外键约束没有效果
- 表级约束:除了非空、默认,其他都支持
创建表时添加约束
添加列级约束
- 直接添加到列的数据类型后面
- 只支持:默认、非空、主键、唯一
- 如果要添加多个约束,用空格隔开
- 补充:查看表中所有的索引,包括主键、外键、唯一
show index from 表名;
添加表级约束
- 语法:在各个字段的最下面添加
【constraint 约束名】 约束类型(字段名)
- 其中
constrint 约束名
相当于给约束起别名,约束名不起的话,会有默认的约束名,因此可以省略 - 表级约束不支持非空和默认
通用的写法
- 除了外键约束使用表级约束,其他都是用列级约束写
主键和唯一的对比
- | 保证唯一性 | 是否允许为空 | 一个表中可以有多少个该约束 | 是否允许组合 |
---|---|---|---|---|
主键primary key | yes | no | 最多有1个 | yes,但是不推荐 |
唯一unique | yes | yes(允许有多个null) | 可以有多个 | 可以,但是不推荐 |
- 允许组合的意思是可以将两个字段组合起来作为主键,但是要使用表级约束来实现。
- 对于组合主键约束或组合唯一约束,其唯一性要求组合的多个字段不同时相同即可。
外键的特点
- 要求在从表设置外键关系
- 从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
- 主表的关联列必须是一个key(一般是主键或唯一键,主键居多)
- 插入数据时,先插入主表,再插入从表
- 删除数据时,先删除从表,再删除主表(如果先删除主表,会报错提示主表正被占用)
修改表时添加约束
语法
- 添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束; #如果不填就是将字段修改成无约束
- 添加表级约束
alter table 表名 add 【constraint 约束名】 约束类型(字段名) 【外键的引用】;
示例
- 添加非空
- 添加默认
- 添加主键
- 列级约束
- 表级约束
- 列级约束
- 添加唯一
-
列级约束
-
表级约束
-
- 添加外键
修改表时删除约束
- 删除非空约束
- 删除默认约束(这里省略了最后面的null)
- 删除主键
- 删除唯一
- 删除外键(最好给外键起约束名,否则可能报错)
外键的级联删除和级联置空
- 当我们想删除主表中有外键约束的数据时(即表A作为主表,表B作为从表,表B中的字段M添加了外键约束,与表A中的字段N相连接,现在想要删除表A中字段N中的数据),要求先从从表中删除相关数据,再从主表中删除。(即想要删除表A的字段N中值为x的数据,就要先将表B的字段M中值为x的数据全部删除,才能删除表A中的数据)
- 可以通过在添加外键约束时,添加
on delete cascade
级联删除关键字,或添加on delete set null
级联置空关键字,来实现直接在主表中删除外键数据。
级联删除
- 直接在添加外键约束时,在语句的最后面加上
on delete cascade
关键字
- 效果:在删除主表中的外键数据时,从表中外键字段符合条件的数据也都被删除
- 现删除主表中id=3的数据,删除后主表和从表中的结果(级联删除)
级联置空
- 直接在添加外键约束时,在语句的最后面加上
on delete set null
关键字 - 效果:在删除主表中的外键数据时,从表中外键字段符合条件的数据,其外键字段被置为null
- 现删除主表中id=2的数据,删除后主表和从表中的结果(级联置空)