navicat 17 拖拽连线仅为绘图操作,不生成任何外键约束;真正生效的 on delete cascade 必须在“设计表→外键”页手动填写字段、引用表、引用字段及删除规则,并确保引擎为innodb、字段类型严格一致、被引用字段有主键或唯一索引、子表外键字段已建索引,且勾选“启用外键检查”后执行ddl才生效。

Navicat 17 里拖拽连线本身不设置级联删除,它只是画图;真正生效的 ON DELETE CASCADE 必须在「设计表 → 外键」页手动配置。
为什么拖线后 SHOW CREATE TABLE 没有 CASCADE?
Navicat 的 ER 图中从 orders.user_id 拖到 users.id,只往本地 .ndm 文件写坐标,数据库完全无感知。哪怕连一百次线,只要没在 Foreign Keys 标签页点“添加”并执行,SHOW CREATE TABLE orders 就永远看不到 FOREIGN KEY ... ON DELETE CASCADE。
- 拖线双击弹出的窗口,默认停留在“关系”页——那是只读预览,不能改行为
- 必须手动切到“外键”选项卡,才能编辑
ON DELETE和ON UPDATE - 若该字段已存在外键约束但行为不是 CASCADE,直接改选项再保存会触发
ALTER TABLE ... DROP FOREIGN KEY+ADD CONSTRAINT,不是原地修改
Foreign Keys 标签页里怎么填才真生效?
右键子表 →「设计表」→ 切到「外键」页 → 点「+」新增 → 填以下四项(缺一不可):
-
字段:选子表中已有字段(如user_id),类型必须和父表主键严格一致(含UNSIGNED、字符集、长度) -
被引用的表:选父表(如users),且该表引擎必须是InnoDB(MyISAM直接忽略外键) -
被引用的字段:必须是父表的PRIMARY KEY或UNIQUE约束字段(仅INDEX不行) -
删除时:下拉选CASCADE;注意:若字段不允许为 NULL,SET NULL会静默失败
保存前务必勾选「启用外键检查」(Navicat 15+ 默认关闭),否则约束建了也不校验。
级联删除生效后,怎么验证它真在跑?
别只信图上那根橙色线——它只代表 ON DELETE CASCADE,但可能因缓存或权限未刷新而失真:
- 执行
SELECT CONSTRAINT_NAME, UPDATE_RULE, DELETE_RULE FROM information_schema.KEY_COLUMN_USAGE JOIN information_schema.REFERENTIAL_CONSTRAINTS USING (CONSTRAINT_NAME) WHERE TABLE_NAME = 'orders',确认DELETE_RULE是CASCADE - 手动删一条
users记录,立刻查orders,看关联行是否消失(不是变 NULL) - 如果没删掉,检查
FOREIGN_KEY_CHECKS是否为 1:SELECT @@FOREIGN_KEY_CHECKS
ER 图里的橙色连线是快捷参考,但真实行为只藏在 information_schema 和实际 DML 结果里——这点最容易被忽略。











