一、引言
上一个博客讲解并演示给字段加外键约束,以及通过外键来保证数据的一致性和完整性。我们一旦为子表 emp 字段 dept_id 添加外键关联之后,再去删除父表的数据之后,判断当前父表的这条数据是否在子表关联关系。如果存在,则不允许删除。
这里实际上涉及到外键约束当中的删除和更新行为。
二、外键约束(删除和更新行为)
(1)主要的行为有以下情况。
注意:
1、NO ACTION:(no action) 和 RESTRICT (restrict:限制)
2、NO ACTION、RESTRICT 外键约束的默认行为
3、CASCADE:(cascade),这个操作称为级联。如果有,也删除/更新外键在子表中的记录,也就是跟着父表字段值一起修改或删除。
4、SET NULL:如果有,则设置子表中该外键值为 NULL 。也就是断开关联,保证数据的一致性和正确性。
(特别注意前4个)
5、SET DEFAULT:父表变更,如果有外键,则子表将外键设置成一个默认值
(2)接下来展示,如何在创建外键的时候来指定它们的删除以及更新的规则或者是行为。
语法:
注意:
1、前一部分是添加外键的语法。(之前学过)
2、我们只要在之前学的操作语法后面再加上一些东西:
ON UPDATE:(on update 在更新时),然后可以在后面加上要选择的行为:如 CASCADE
ON DELETE:(on delete 在删除时),如上
三、实操
还是用之前建立的两张表:员工表 emp 和 部门表:dept 。
(1)数据准备
CREATE TABLE dept ( id INT AUTO_INCREMENT COMMENT 'ID' PRIMARY KEY, name VARCHAR(50) NOT NULL COMMENT '部门名称' ) COMMENT '部门表'; INSERT INTO dept (id, name) VALUES (1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'总经办'); CREATE TABLE emp ( id INT AUTO_INCREMENT COMMENT 'ID' PRIMARY KEY, 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' ) COMMENT '员工表'; INSERT INTO emp (id, name, age, job, salary, entrydate, managerid, dept_id) VALUES (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), (6,'小昭',19,'程序员鼓励师',6600,'2004-10-12',2,1);
部门表:dept
员工表:emp
(2) 开始操作
当前这两张表还没有任何的外键约束。
接下来给他们建立外键约束,还有要指定它们的删除和更新行为。
1、首先测试加的是:CASCADE
/* add constraint 外键 括号里代表的外键字段 */ ALTER TABLE emp ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY (dept_id) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE;
子表外键字段对应的值全部变成6,也就是因为父表的字段的值的更新。
注意:如果我把父表中的字段值删除了之后,子表中外键的值也会跟着删除!!!
2、 其次测试加的是:SET NULL
在 DataGrip 中删除之前的两张表,再执行之前的SQL语句去重新创建这两张表。
/* add constraint 外键 括号里代表的外键字段 */ ALTER TABLE emp ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY (dept_id) REFERENCES dept(id) ON UPDATE SET NULL ON DELETE SET NULL;
子表外键字段对应的值全部变成null,也就是因为父表字段值的删除。
四、其次在工具 DataGrip 可以直接图形界面工具直接操作
1、第一步
2、第二步
到此关于这篇博客的外键约束的学习就结束了。