Navicat 16中ON DELETE下拉框位于表设计器的“外键”选项卡第七列(标为“在删除时”或“on delete”),需右键表→设计表→切换至该选项卡→点击外键行后选择;RESTRICT立即阻止删除并报错,SET NULL要求子表字段允许NULL否则失效,CASCADE自动删除关联子行但风险高;配置后须点击绿色“运行”按钮执行SQL,且依赖父表主键/唯一约束、字段类型一致、引擎为InnoDB才生效。
ON DELETE 下拉框在哪找
navicat 16 的外键行为设置不在“列”或“索引”选项卡,而是在表设计器的 外键 选项卡里。右键表 → “设计表” → 切换到“外键”标签页 → 点击已添加或新增的外键行 → 第七列(通常标为“在删除时”或 on delete)就是下拉菜单位置。
RESTRICT、SET NULL、CASCADE 实际效果差异
选错 ON DELETE 不是“没用”,而是会直接导致业务逻辑出错或 SQL 报错:
-
RESTRICT:父表记录被DELETE时,只要子表还有引用它的行,MySQL 立即报错Cannot delete or update a parent row: a foreign key constraint fails -
SET NULL:仅当子表外键字段定义为NULL(如class_id INT NULL)才生效;否则 Navicat 保存时静默失败,或执行时报Field 'class_id' doesn't have a default value -
CASCADE:父表删一行,所有关联子表行自动删除——看似省事,但误删风险极高,生产环境慎用
为什么改了 ON DELETE 却没同步进 SQL?
Navicat 的“保存”按钮不等于 SQL 执行成功。常见原因不是操作路径错,而是底层约束不满足,导致 DDL 生成失败但界面无明显提示:
- 父表被引用字段(如
users.id)不是PRIMARY KEY或没加UNIQUE约束 - 子表外键字段类型与父表不一致,例如
INTvsUNSIGNED INT,或NOT NULLvsNULL - 任一表引擎不是
InnoDB(MyISAM 不支持外键),右键表 → “对象信息” → 检查并修改引擎 - Navicat 没真正覆盖旧外键:执行
SHOW CREATE TABLE student;,确认输出中FOREIGN KEY ... ON DELETE是否与界面一致
同步到 SQL 时必须手动点“运行”
填完 ON DELETE 后,别只点窗口右上角的“保存”图标。Navicat 默认只是缓存配置,不会自动执行 DDL:
- 必须点击左上角绿色三角形
运行按钮(或按Ctrl + R) - 紧盯底部状态栏:出现“执行成功”才算落地;若显示错误(如
ERROR 1005),要读完整报错,不是重开窗口就能解决 - 如果目标库已有同名外键,Navicat 可能跳过更新——此时需先手动
DROP FOREIGN KEY,再重新配置
NULL ——SET NULL 看似温和,但只要字段定义含 NOT NULL,它就根本不会写入数据库,连报错都可能被界面吞掉。











