外键约束
概念
外键用来让两张表的数据之间连接,从而保证数据的一致性和完整性
员工表 emp (子表)
id | name | age | job | salary | entrydate | managerial | dept_id |
---|---|---|---|---|---|---|---|
1 | 金庸 | 66 | 总裁 | 20000 | 2000-01-01 | null | 5 |
2 | 张无忌 | 20 | 项目经理 | 12500 | 2005-12-05 | 1 | 1 |
3 | 杨逍 | 33 | 开发 | 8400 | 2000-11-03 | 2 | 1 |
4 | 韦一笑 | 48 | 开发 | 11000 | 2002-02-05 | 2 | 1 |
5 | 常遇春 | 43 | 开发 | 10500 | 2004-09-07 | 3 | 1 |
部门表 dept (父表)
id | name |
---|---|
1 | 研发部 |
2 | 市场部 |
3 | 财务部 |
4 | 销售部 |
5 | 总经办 |
目前上述的两张表,在数据层面并未建立外键关联,所以是无法保证数据的一致性和完整性的
添加外键的语法
1 | ALTER TABLE 子表名 |
示例:
1 | alter table emp add constraint dept_id foreign key (dept_id) references dept(id); |
删除外键语法
1 | ALTER TABLE 表名 DROP FOREIGN KEY 外键名称; |
示例:
1 | ALTER TABLE emp DROP FOREIGN KEY emp_dept; |
删除/更新行为
行为 | 说明 |
---|---|
NO ACTION | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与 RESTRICT 一致) |
RESTRICT | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与 NO ACTION 一致) |
CASCADE | 当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则删除/更新外键在子表中的记录。 |
SET NULL | 当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为 null(这就要求该外键允许取 null)。 |
SET DEFAULT | 父表有变更时,子表将外键列设置成一个默认的值 (InnoDB 不支持) |
语法
1 | ALTER TABLE 子表名 ADD CONSTRAINT 外键约束名称 FOREIGN KEY (子表字段) REFERENCES 父表名(父表字段) on UPDATE 行为 on DELET 行为 ; |