目录
为什么需要约束
什么是约束
约束的分类
约束等级(配合外键使用)
为什么需要约束
数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。它是防止数据库中 存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。
SQL规范以约束的方式对表数据进行额外的条件限制
实体完整性(Entity Integrity) :例如,同一个表中,不能存在两条完全相同无法区分的记录
域完整性(Domain Integrity) :例如:年龄范围0-120,性别范围“男/女”
引用完整性(Referential Integrity) :例如:员工所在部门,在部门表中要能找到这个部门
用户自定义完整性(User-defined Integrity) :例如:用户名唯一、密码不能为空等,本部门
什么是约束
首先是表级的强制规定
创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后通过 ALTER TABLE 语句规定约束。
约束的分类
根据约束数据列的限制:
- 单列约束
- 多列约束
根据约束的作用范围:
- 列级约束
- 表级约束
根据约束的作用:
- NOT NULL 非空约束,规定某个字段不能为空
删除使用alter table **** modify **** ****NULL;或者去掉not NULL
- UNIQUE 唯一约束,规定某个字段在整个表中是唯一的
1. 特点:
同一个表可以有多个唯一约束。
唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯一。
唯一性约束允许列值为空。
在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。
MySQL会给唯一约束的列上默认创建一个唯一索引。
2.可以通过add或者modify增加唯一键约束
3.复合唯一约束:
4.删除唯一约束
- 添加唯一性约束的列上也会自动创建唯一索引。
- 删除唯一约束只能通过删除唯一索引的方式删除。
- 删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。
- 如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和() 中排在第一个的列名相同。也可以自定义唯一性约束名。
- PRIMARY KEY 主键(非空且唯一)约束
1. 同唯一约束语法类似,区别在于:
不允许NULL值。
MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用。
需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的 值,就有可能会破坏数据的完整性。
2.删除主键约束就可以删除主键索引
alter table 表名称 drop primary key;
- 自增列:AUTO_INCREMENT
1.特点和要求
(1)一个表最多只能有一个自增长列
(2)当需要产生唯一标识符或顺序值时,可设置自增长
(3)自增长列约束的列必须是键列(主键列,唯一键列)
(4)自增约束的列的数据类型必须是整数类型
(5)如果自增列指定了 0 和 null,会在当前最大值的基础上自增;如果自增列手动指定了具体值,直接赋值为具体值。
2.增加和删除都使用modify 。
3.MySQL8.0自增变量的持久化。
- FOREIGN KEY 外键约束
主表(父表):被引用的表,被参考的表
从表(子表):引用别人的表,参考别人的表
1.特点:
(1)从表的外键列,必须引用/参考主表的主键或唯一约束的列 为什么?因为被依赖/被参考的值必须是唯一的
(2)在创建外键约束时,如果不给外键约束命名,默认名不是列名,而是自动产生一个外键名(例如 student_ibfk_1;),也可以指定外键约束名。
(3)创建(CREATE)表时就指定外键约束的话,先创建主表,再创建从表
(4)删表时,先删从表(或先删除外键约束),再删除主表
(5)当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖 该记录的数据,然后才可以删除主表的数据
(6)在“从表”中指定外键约束,并且一个表可以建立多个外键约束
(7)从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样,逻辑意义一致。如果类 型不一样,创建子表时,就会出现错误“ERROR 1005 (HY000): Can't create table'database.tablename'(errno: 150)”。
(8)当创建外键约束时,系统默认会在所在的列上建立对应的普通索引,但是索引名时是列名,不是外键的约束名。
(9)删除外键约束后,必须 手动 删除对应的索引
2.使用add的方式在建表后增加外键约束。
3.删除外键约束需要先删除外键约束名用drop,第二步在删除索引drop index。
- CHECK 检查约束
- 5.7虽然支持,但是没用。
- 用法check()
- DEFAULT 默认值约束
1.增加、删除使用modify。
约束等级(配合外键使用)
- Cascade方式 :在父表上update/delete记录时,同步update/delete掉子表的匹配记录
- Set null方式 :在父表上update/delete记录时,将子表上匹配记录的列设为null,但是要注意子 表的外键列不能为
- not null No action方式 :如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作
- Restrict方式 :同no action, 都是立即检查外键约束
- Set default方式 (在可视化工具SQLyog中可能显示空白):父表有变更时,子表将外键列设置 成一个默认的值,但Innodb不能识别 如果没有指定等级,就相当于Restrict方式。
对于外键约束,最好是采用: ON UPDATE CASCADE ON DELETE RESTRICT 的方式。