on delete cascade 是外键级联删除机制,主表记录删除时子表对应外键记录自动清除;其余规则包括 set null(外键置空)、restrict/no action(禁止删除)及 innodb 不支持的 set default。

外键删除时主键数据本身不会被改动,真正受影响的是外键所在的从表记录——具体行为完全取决于建表时定义的 ON DELETE 规则,而不是主键表自身结构或数据状态。
ON DELETE CASCADE:主键删,从表跟着删
方法一:级联删除生效时,删除主表某条主键记录,所有从表中引用该主键值的外键行会自动删除。
这一步操作不可逆,且不会触发任何提示或确认。
方法二:执行 DELETE FROM parent_table WHERE id = 123; 后,MySQL InnoDB 引擎会自动扫描所有关联的子表,定位 【外键字段值等于123】 的所有行并一并清除。
注意:若子表数据量极大(如百万级订单),该语句可能造成锁表时间延长,甚至触发超时中断。
ON DELETE SET NULL:主键删,从表外键置空
第一步:确保从表中外键字段允许为 NULL,否则建约束时会报错;
第二步:执行主表删除后,InnoDB 将匹配到的所有子表外键列值设为 NULL;
第三步:原主键值在子表中彻底消失,但该子表记录仍保留。
这个动作要求外键列必须声明为 NULL,否则约束无法创建成功。如果字段定义是 NOT NULL,SET NULL 规则直接失效,建表语句会拒绝执行。
ON DELETE RESTRICT / NO ACTION:主键删不了
这是 MySQL 默认行为,无需显式声明。
只要从表中存在引用该主键的记录,DELETE 语句就会报错:Cannot delete or update a parent row: a foreign key constraint fails。
此时必须先手动清理从表数据,或临时禁用外键检查:SET FOREIGN_KEY_CHECKS = 0; ——但【禁用后未及时恢复将导致后续插入/更新失去外键保护】,极易引发脏数据。
ON DELETE SET DEFAULT:仅理论存在,InnoDB 不支持
InnoDB 存储引擎明确不支持 SET DEFAULT 行为,建表时指定该规则会被忽略,实际效果等同于 RESTRICT。
试图使用 ON DELETE SET DEFAULT 创建外键,MySQL 会静默降级处理,不报错也不生效。











