navicat同步模型时不支持跳过单个约束,只能通过tools→options→data synchronization→advanced关闭整类约束(如check、外键)的生成,无法按名称忽略特定约束。

同步模型时无法跳过单个约束,只能关闭整类约束生成
Navicat 16 的「同步模型到数据库」不支持按名称忽略某条 CHECK、FOREIGN KEY 或 UNIQUE 约束。它只有全局开关:关掉某类约束的生成,而不是“跳过 users.id_not_null”。你填不了 IGNORE CONSTRAINT chk_age_range,也没地方输入约束名。
常见错误现象:在模型里删掉了某个 CHECK 表达式,但同步后目标库仍报 ERROR 3819 (HY000);或外键字段类型明明改了,同步脚本里还带着旧的 FOREIGN KEY (user_id) REFERENCES users(id) —— 这不是 Navicat 没识别变更,而是它根本没提供按约束粒度过滤的能力。
- 必须进入
Tools → Options → Data Synchronization → Advanced - 取消勾选
Generate CHECK constraints(MySQL 8.0+ 才需操心) - 取消勾选
Compare foreign keys和Generate foreign keys(否则外键定义会强制写入) - 若只需保留主键和索引,可同时关掉
Compare indexes外的全部选项
外键约束被忽略后,关联表建表顺序仍可能出错
关掉 Generate foreign keys 只是让 Navicat 不输出 FOREIGN KEY 子句,但它**不会自动调整建表顺序**。比如模型里 orders 表依赖 customers,即使不建外键,若 customers 表还没 CREATE,orders 的 user_id INT 字段本身没问题,但后续手动加约束时会因表不存在而失败。
真正影响执行成败的是依赖顺序,不是约束开关。很多人以为“关了外键就万事大吉”,结果同步脚本第一行就是 CREATE TABLE orders,第二行才建 customers,直接卡在 ERROR 1146: Table 'db.customers' doesn't exist。
- 在结构同步窗口左侧的 Source Objects 树中,手动拖动被引用表(如
customers)到引用表(如orders)上方 - 右键表名 →
Expand All快速展开字段/索引节点,确认依赖关系可视化可见 - 导出 DDL 到文件后,用文本编辑器搜索
REFERENCES,确认已无残留(哪怕关了选项,旧模型残留定义也可能漏出)
NOT NULL 和 DEFAULT 约束不能被单独忽略
Navicat 没有 Ignore NOT NULL constraints 这类设置。一旦字段在模型里设为 NOT NULL 或带 DEFAULT '2026-01-01',同步时就会原样写进 CREATE TABLE。如果你的目标库已有数据且含 NULL 值,同步会因 ALTER TABLE ... SET NOT NULL 失败中断——这不是约束“被忽略”,而是它压根没给你留绕过的入口。
典型场景:测试库 customers 表 id 是 INT NOT NULL,但生产库历史数据里有 id = NULL(MyISAM 时代遗留),你只想同步结构、不碰数据,却卡在 ERROR 1138: Invalid use of NULL value。
- 临时方案:在模型中右键该字段 → 编辑 → 取消勾选
Not Null,同步完再手动补ALTER TABLE ... MODIFY id INT NOT NULL - 更稳做法:同步前在目标库执行
SELECT COUNT(*) FROM customers WHERE id IS NULL;,确认无 NULL 后再开NOT NULL - DEFAULT 值若含函数(如
NOW()),MySQL 5.7 不支持列级函数默认值,必须手动改成字符串或迁移到触发器逻辑
同步预览里看不到约束是否被跳过,必须查 SQL 文本
Navicat 的「部署脚本」窗口只显示最终要执行的语句,但不会标注哪条约束因选项关闭而消失。它不会写“已跳过 CHECK chk_status”,也不会高亮被移除的 CONSTRAINT 关键字。你看到的是一堆干净的 CREATE TABLE,误以为所有约束都生效了,直到上线后发现状态校验失效。
最容易被忽略的是:关掉 Generate CHECK constraints 后,模型里仍显示黄色感叹号图标(表示存在 CHECK),但这只是 UI 提示,和实际生成无关。没人会盯着那个图标去翻 SQL,除非你养成习惯——每次点「部署」前,先导出 SQL 文件,再全局搜索 CHECK、FOREIGN KEY、UNIQUE KEY。
- 快捷操作:在部署脚本窗口按
Ctrl + F,分别搜CHECK、REFERENCES、UNIQUE KEY - 若搜到任意一条,说明对应选项没关对,或模型里残留了未清理的约束定义
- 特别注意:MySQL 的
PRIMARY KEY是强制生成的,无法关闭,它不算“可忽略约束”











