MySQL 视频课 · 50 集 / 约束:概述、演示、外键与更新删除行为 / P35
第 35 集 / 共 50 · 约束:概述、演示、外键与更新删除行为 · 视频 p=35 · 时长 8:58
P35 35. 基础-约束-外键删除更新行为
看视频,对照阅读:在新标签打开原视频(p=35)
父表被删被改时子表如何反应,由删除/更新行为决定。
复习模式:快速跳知识点(详解在下方各节)
复习顺序:先看“一句话理解”能否复述,再扫步骤,最后做自测;答不出时回到小例与易错。
一句话理解
父表记录被删或被改时子表怎么办,由 ON DELETE / ON UPDATE 后面的行为决定。
按这 4 步做
- RESTRICT / NO ACTION:子表还有引用就拒绝删除或修改,这是默认的保守选择。
- CASCADE:父表删一行,子表对应的行一起删;父表改主键,子表跟着改。
- SET NULL:父表删一行,子表外键列置空,前提是该列允许 NULL。
- SET DEFAULT:设计上置默认值,但 InnoDB 不支持,别在 MySQL 里指望它。
小例
ALTER TABLE employee
ADD CONSTRAINT fk_employee_department
FOREIGN KEY (dept_id) REFERENCES department (id)
ON DELETE SET NULL
ON UPDATE CASCADE;
【原创演示】仍是那两张练习表。设成 SET NULL 后删掉部门 2,小陈这一行的 dept_id 会变成 NULL,人还留在表里;如果改成 ON DELETE CASCADE,删部门 2 会连小陈一起删掉,这就是风险点。dept_id 必须可为空,否则 SET NULL 在删除时会报错。本页原创例已在隔离的 MySQL 8.0.46 测试实例执行通过;也可以用 p35.sql 复现。
易错点
- 为了“删起来方便”选 CASCADE:删一条父表记录可能连带删掉大量子表业务数据,且难恢复。
- 外键列是 NOT NULL 却设 SET NULL:删除父行时直接报错,约束和列定义要先对齐。
- 以为 RESTRICT 和 CASCADE 只是写法不同:一个拒绝操作、一个扩散删除,语义正好相反。
30 秒速记
自测(2 题,先答再展开)
自测 1:SET NULL 和 CASCADE 在“删部门”时分别发生什么?
SET NULL 只把子表外键置空、员工行保留;CASCADE 会把引用该部门的员工行一起删掉,数据直接消失。
自测 2:为什么 RESTRICT 常被当作默认推荐?
它让删除在存在引用时失败,迫使你先处理子数据,避免一次误删扩散到多张表。
材料与来源
展开材料出处、讲义页码与证据等级
| 材料 | 类型 / 位置 | 支持了什么 |
|---|---|---|
| P35 原视频页(BV1Kr4y1i7ru) | 平台视频页 · P35;采样静帧 t012/t20/t30/t40/t50/t60/t70/t80/tend | t020–t040 为“外键约束 删除/更新行为”表格页。 |
| MySQL 8.0 Reference:FOREIGN KEY 约束的参照操作 | 官方文档 | 核对 CASCADE/SET NULL/RESTRICT 与 InnoDB 对 SET DEFAULT 的支持情况,未逐字引用。 |
按 t020/t030/t040/t070 帧核对:画面为“外键约束 删除/更新行为”表格,列出 NO ACTION(与 RESTRICT 一致)、RESTRICT、CASCADE、SET NULL(要求外键允许取 null)、SET DEFAULT(Innodb 不支持)。正文示例 DDL 为原创且未执行;无字幕,讲师现场演示未核实。
讲义对照:讲义 4.3.3 删除/更新行为 · p67–68(公开镜像;按主题对应,切点 notexact)
- 画面静帧 9 帧,采样点 0:12–8:45 / 全片 8:58(只用于确认画面主题,不作内容边界)
- 原声字幕未取得:匿名接口字幕轨为空且需登录,未使用任何账号
等级含义:平台视频页 / 官方文档 / 课件 = 原始材料;二手整理 = 参考;推断 = 未经核实。站内补充的解释与练习会在此说明。