Navicat 16中ON DELETE CASCADE需在“外键”选项卡第七列下拉框选择,前提为父表主键/唯一约束、子表外键字段类型完全匹配、两表引擎均为InnoDB,否则设置不生效。
必须把 on delete 设为 cascade,且确保父表主键、子表外键字段类型完全一致、两表引擎都是 innodb,否则级联删除不会触发。
Navicat 16 里 ON DELETE CASCADE 在哪选
右键子表 → “设计表” → 切换到“外键”选项卡 → 找到已添加或新增的外键行 → 点击该行末尾第七列(标为“在删除时”或 ON DELETE)的下拉框 → 选择 CASCADE。
注意:这个选项不是藏在二级菜单里,而是直接暴露在表格单元格中;如果下拉框灰掉或没有 CASCADE,说明前置条件不满足(比如引擎不是 InnoDB 或字段类型不匹配)。
为什么设了 CASCADE 却没级联删除
常见静默失败原因:
- 子表或父表引擎是
MyISAM—— 必须右键表 → “对象信息” → 把存储引擎改成InnoDB再保存 - 子表外键字段(如
order_id)定义为INT UNSIGNED,但父表主键是INT(无符号性不一致) - 父表被引用字段没加
PRIMARY KEY或UNIQUE约束,只建了普通索引 - Navicat 界面点了“保存”,但底部状态栏没显示“执行成功”,实际 DDL 被跳过 —— 此时要手动执行
SHOW CREATE TABLE 子表名;确认输出里FOREIGN KEY ... ON DELETE CASCADE是否真实存在
设置前必须核对的三个硬性条件
缺一不可,否则 Navicat 会允许你点选 CASCADE,但保存时静默失败或不生效:
- 父表被引用字段必须是
PRIMARY KEY或带UNIQUE约束(不能只是INDEX) - 子表外键字段与父表被引用字段类型严格一致:包括类型(
INTvsBIGINT)、符号性(SIGNEDvsUNSIGNED)、长度(INT(11)隐含匹配,但INT(5)和INT(11)在某些版本下会拒接) - 两张表都必须是
InnoDB引擎 ——MyISAM完全不支持外键,选了也白选
级联删除的实际行为和风险
CASCADE 不是“自动帮你删干净”,而是按约束路径逐层触发:
- 删
orders表某条记录 → 自动删order_items中所有order_id匹配的行 - 但如果
order_items表自己又对外键(比如关联products)设置了ON DELETE CASCADE,那删orders可能间接导致products被删(极危险!) - MySQL 不支持跨多层深度校验,一旦误配,
DELETE FROM orders WHERE id = 123可能意外清空几十张表的数据 - 建议只在明确的一对多强依赖关系中使用(如订单/明细、文章/标签映射),避免在有中间表或多级外键的模型里滥用
真正容易被忽略的是:级联动作发生在 SQL 执行层面,不走应用逻辑,也不会触发任何触发器或 ORM 的生命周期钩子。删之前,务必确认业务上是否真的需要这种“无感穿透式删除”。


















