1. 准备测试表
# 专业表major create table major(id int primary key auto_increment, mmane varchar(20))engine=innodb default charset=utf8; # 学生表mstudent create table mstudent(id int primary key auto_increment, name varchar(20), major int)engine=innodb default charset=utf8; # 添加外键约束(级联删除) alter table mstudent add constraint fk_major_stu foreign key(major) references major(id) on delete cascade; # 插入数据 insert into major values(null, 'python'), (null, 'java'), (null, 'go'); insert into mstudent select null, 'A', 1 union select null, 'B', 1 union select null, 'C', 1 union select null, 'D', 2 union select null, 'E', 2 union select null, 'F', 2 union select null, 'G', 3 union select null, 'H', 3 union select null, 'J', 3 union select null, 'K', 3;
1. 级联删除
如果没有在添加外键约束时显式声明级联类型,那么在对主表(外键引用表)相关字段A做DML(UPDATE DELETE INSERT)操作时,从表(有外键约束)中拥有引用自主表字段A的数据行就会发生冲突,造成错误。换句话说,要删除或更新主表数据,就需要先删除或更新从表相关数据
当一个外键的级联类型为DELETE CASCADE时,便支持直接删除主表数据(特别是主表数据被从表引用)
3. 级联更新(UPDATE CASCADE)
ALTER TABLE ADD CONSTRAINT fk_major_stu FOREIGN KEY(major) REFERENCES major(id) ON UPDATE CASCADE;
可以不用先更新从表数据,直接更新主表数据,从表自动更新。
4. 级联置空(SET NULL)
ALTER TABLE ADD CONSTRAINT fk_major_stu FOREIGN KEY(major) REFERENCES major(id) ON SET NULL;
可以不用先删除从表数据,直接删除主表数据,从表自动置空相关数据。