# P35 35. 基础-约束-外键删除更新行为

> 本页是学习笔记，不等同于视频逐字稿。原声字幕未取得（匿名接口字幕轨为空且需登录，未使用任何账号），也没有逐句讲解记录；讲义只按节与页码对应，切点未逐句确证。

> 以同版讲义的公开镜像核对章节与页码（镜像非官方出品）；非逐字稿，示例为原创补充。

## P35 35. 基础-约束-外键删除更新行为

- 原视频：https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=35（p=35），时长 8:58
- 讲义：4.3.3 删除/更新行为 p67–68（公开镜像；按主题对应，切点 notexact）

- 本集练习数据：practice/p35.sql（先执行，再对照小例）

### 一句话理解

父表记录被删或被改时子表怎么办，由 ON DELETE / ON UPDATE 后面的行为决定。

### 步骤

1. RESTRICT / NO ACTION：子表还有引用就拒绝删除或修改，这是默认的保守选择。
2. CASCADE：父表删一行，子表对应的行一起删；父表改主键，子表跟着改。
3. SET NULL：父表删一行，子表外键列置空，前提是该列允许 NULL。
4. SET DEFAULT：设计上置默认值，但 InnoDB 不支持，别在 MySQL 里指望它。

### SQL 示例

```
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 秒速记

RESTRICT/NO ACTION 拒绝、CASCADE 连动、SET NULL 置空（列须可空）、SET DEFAULT InnoDB 不支持。

### 自测

1. SET NULL 和 CASCADE 在“删部门”时分别发生什么？
   - 答：SET NULL 只把子表外键置空、员工行保留；CASCADE 会把引用该部门的员工行一起删掉，数据直接消失。
2. 为什么 RESTRICT 常被当作默认推荐？
   - 答：它让删除在存在引用时失败，迫使你先处理子数据，避免一次误删扩散到多张表。

### 材料与来源

- [平台视频页] P35 原视频页（BV1Kr4y1i7ru） https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=35
- [官方文档] MySQL 8.0 Reference：FOREIGN KEY 约束的参照操作 https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html

证据说明：按 t020/t030/t040/t070 帧核对：画面为“外键约束 删除/更新行为”表格，列出 NO ACTION（与 RESTRICT 一致）、RESTRICT、CASCADE、SET NULL（要求外键允许取 null）、SET DEFAULT（Innodb 不支持）。正文示例 DDL 为原创且未执行；无字幕，讲师现场演示未核实。
