3.外键约束

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

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值