1.什么是外键约束?
外键约束(FOREIGN KEY,缩写FK)是用来实现数据库的参照完整性的,外键约束可以使两张表紧密的结合起来,特别是针对修改或者删除的级联操作时,会保证数据的完整性.
外键是指表中某个字段的值依赖于另一张表中某个字段的值,而被依赖的字段必须具有主键约束或者唯一约束.被依赖的表我们通常称之为父表或者主表,设置外键约束的表称为子表或者从表.
-- 创建主表:班级表
CREATE TABLE t_class(
cno INT(4) PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(10) NOT NULL,
room CHAR(4)
);
-- 一次性添加多条记录
INSERT INTO t_class VALUES (NULL,'java001','r803'),(NULL,'java001','r813'), (NULL,'java001','r823');-
-- 创建子表,学生表:
CREATE TABLE t_student(
sno INT(6) PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(5) NOT NULL,
classno INT(4), -- 取值参考t_clas表中的cno字段,不要求字段名完全重复,但是类型长度定义 尽量要求相同
-- 添加外键约束
CONSTRAINT fk_stu_classno FOREIGN KEY(classno) REFERENCES t_class(cno)
);
-- 外键约束也可以创建表之后添加
ALTER TABLE t_student ADD CONSTRAINT fk_stu_classno FOREIGN KEY(classno) REFERENCES t_class(cno)
-- 添加表数据
INSERT INTO t_student VALUES(NULL,'张三',1),(NULL,'李四',1),(NULL,'王五',2);
-- 删除表数据
DELETE FROM t_class WHERE cno = 2;
DELETE FROM t_student WHERE classno =2;
注意:
先删除主表,在删除从表
外键策略
-- 删除班级2:如果直接删除的话肯定不行因为有外键约束:
-- 加入外键策略
-- 策略1:no action 不允许操作
-- 通过操作sql来完成:
-- 先把班级2的学生对应的班级改为null
UPDATE t_student SET classno = NULL WHERE classno = 2;
-- 然后再删除班级2:
DELETE FROM t_class WHERE cno = 2;
-- 策略2:cascade 级联操作:操作主表的时候影响从表的外键信息
-- 先删除之前的外键约束:
ALTER TABLE t_student DROP FOREIGN KEY fk_stu_classno;
-- 重新添加外链约束:on update cascade on delete cascade 更新和删除都有节点操作
ALTER TABLE t_student ADD CONSTRAINT fk_stu_classno FOREIGN KEY (classno) REFERENCES t_class(cno) ON UPDATE CASCADE ON DELETE CASCADE;
-- 试试更新:
UPDATE t_class SET cno = 5 WHERE cno = 1;
-- 试试删除
DELETE FROM t_class WHERE cno = 5;
-- 策略3:set null 置空操作
-- 先删除之前的外键约束:
ALTER TABLE t_student DROP FOREIGN KEY fk_stu_classno;
-- 重新添加外键约束
ALTER TABLE t_student ADD CONSTRAINT fk_stu_classno FOREIGN KEY(classno) REFERENCES t_class(cno) ON UPDATE SET NULL ON DELETE SET NULL;
-- 试试更新
UPDATE t_class SET cno = 8 WHERE cno = 4;
-- 注意:
-- 1.策略2 级联操作 和 策略3 的删除操作 可以混着使用:
ALTER TABLE t_student ADD CONSTRAINT fk_stu_classno FOREIGN KEY (classno) REFERENCES t_class(cno) ON UPDATE CASCADE ON DELETE SET NULL;
-- 2.应用场景:
-- 朋友圈删除,评论,点赞都删除 --级联操作
-- 解散班级,对应的学生 置为班级为null就可以了 --set null