Navicat 16中on delete规则在“外键”选项卡第七列下拉框选择,含RESTRICT、SET NULL、CASCADE、NO ACTION;需确保父表主键/唯一约束、字段类型完全匹配、引擎为InnoDB,否则设置不生效。
外键删除规则在哪选:Navicat 16“外键”选项卡的 on delete 下拉框
在 navicat 16 的表设计器中,on delete 规则不是隐藏项,而是直接暴露在“外键”选项卡的第七列(通常标为“在删除时”或“on delete”)。右键子表 → “设计表” → 切换到“外键”选项卡 → 点击已添加或新增的外键行 → 在该行末尾的下拉菜单里就能看到 restrict、set null、cascade、no action 四个选项。
RESTRICT 和 SET NULL 的实际行为差异
选 RESTRICT:父表某条记录被 DELETE 时,只要子表里还有引用它的行,操作立刻报错,比如 MySQL 返回 Cannot delete or update a parent row: a foreign key constraint fails。它不删、不改、不放行,纯粹阻断操作。
选 SET NULL:前提是子表外键字段必须允许 NULL(即建表时定义为 class_id INT NULL)。父表记录删除后,所有关联的子表行中该字段值自动设为 NULL,其他字段不变。
常见误判点:
-
SET NULL不会清空整行,只改外键字段 -
RESTRICT和NO ACTION在 MySQL 中效果相同,但语义不同:前者是“提前检查并拒绝”,后者是“检查时机由引擎决定”,实际可视为等价 - 如果子表外键字段设为
NOT NULL,却强行选SET NULL,Navicat 保存时会失败,提示字段约束冲突
配置前必须确认的三件事
否则无论怎么选 on delete 都不会生效:
- 父表(如
class)的被引用字段(如id)必须是PRIMARY KEY或带UNIQUE约束 - 子表外键字段(如
class_id)类型必须和父表完全一致,包括符号性(INTvsUNSIGNED INT)、长度(INT(11)虽常省略但隐含匹配)、是否允许NULL - 两个表都必须使用支持外键的存储引擎,MySQL 下必须是
InnoDB;如果看到表引擎是MyISAM,右键表 → “对象信息” → 修改引擎,再保存
为什么有时改了 on delete 却没反应?
最常被忽略的是:Navicat 的外键设置只是生成 DDL 并执行,但如果你之前手动用 SQL 创建过同名外键,或者表结构被其他工具修改过,Navicat 可能没真正“覆盖”旧约束。此时需确认:
- 执行
SHOW CREATE TABLE student;,看输出里FOREIGN KEY定义中的ON DELETE是否与界面一致 - 如果发现不一致,说明保存未成功——可能因字段类型不匹配、NULL 约束冲突或引擎不支持导致静默失败
- 不要依赖 Navicat 界面右上角的“保存”按钮图标,一定要留意底部状态栏是否显示“执行成功”或弹出错误提示
外键规则不是“开关式”配置,它绑定在约束定义里,一旦创建就固化在表结构中,改规则 = 删除旧约束 + 新建带新规则的约束,中间任何一步卡住,行为就不会变。











