1.什么是约束
约束是作用于表中字段上的规则,以限制表中数据,保证数据的正确性、有效性、完整性
约束分为以下几种:
not null | 非空约束 | 限制该字段的数据不能为null |
unique | 唯一约束 | 保证该字段的所有数据都是唯一、不重复的 |
primary key | 主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 |
default | 默认约束 | 保存数据时,如果未指定该字段的值,则采用默认值 |
check(从mysql 8.0.16版本起,才支持) | 检查约束 | 保证字段值满足某一个条件 |
foreign key | 外键约束 | 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 |
约束可以在创建或修改表时添加(DDL)
2.使用案例
2.1主键与自动增长
上述建表条件中的自动增长(关键字为auto_increment)的含义是 表内每多一条数据,字段自动加一
建表语句如下图:
如果向表中写入如下数据:
则结果如下:
可以看到虽然添加数据时没有输入id的值,但表内还是有id的值,且自动增长
每张表只能有一个自动增长项,通常为主键
2.2自动增长与unique约束的冲突
不过,自动增长有一种特殊情况:继续以上述表为例,向表中写入如下数据
明显,两处重复的tom3违反了name字段的unique约束,这条数据会因为报错不在表中产生。
其结果如下:
可以看到,id直接从3跳到了5。
这是因为unique约束条件需要创建出一行新的数据,再与先前的数据进行比对并加以拦截,这条数据在产生的时候就已经让受到auto_increment约束的字段加1了
其他的约束条件是在创建前加以拦截,因此不会产生这种情况
3.外键
外键用来在2个表之间建立联系。使用外键的表称为子表或从表,与之产生联系的表称为父表或主表
3.1使用语句
(1)创建表
create table 表名(
字段名 数据类型,
...
[constraint] [外键名] foreign key (外键字段名) references 主表名(主表字段名)
);
(2)修改表
alter table 表名 add constraint 外键名 foreign key (外键字段名) references 主表名(主表字段名);
(3)删除外键
alter table 表名 drop foreign key 外键名;
3.2外键使用案例
主表(表名为dept)如下:
从表(表名为emp)如下:
要实现的效果是,让从表的dept_id字段与主表的id字段联系起来。
其使用的语句如下:
在建立了联系后,假如主表要删除 id为1 的那一行数据,数据库会报错。因为从表中外键字段dept_id中正在使用1
3.3外键删除更新行为
虽然在默认情况下主表不能删除从表外键使用的字段,但这可以通过设置从表行为来进行修改
外键有2种常用的删除更新行为:
(1)cascade:父表删除/更新对应记录时,数据库会先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。(父表删除记录后,并不是子表对应的外键处变为空,而是子表对应的一整行数据都被删除)
(2)set null:父表中删除/更新对应记录时,数据库会先检查该记录是否有对应外键,如果有,则设置子表中该外键值为nul。(这就要求该外键允许取null,即不可设置非空约束not null)
修改语句如下:
alter table 表名 add constraint 外键名 foreign key (外键字段名) references 主表名(主表字段名)on update 行为名 on delete 行为名;
#on update后接的是主表更新时的子表行为
#on delete后接的是主表删除时的子表行为