Navicat 17结构同步需严格设定源(左)目标(右)方向,避免误删字段;须手动核对DDL差异、忽略无关COLLATE等元数据;必须显式勾选视图/触发器等高级对象;ADD COLUMN需手动补AFTER/DEFAULT;每次比对均需重新忽略非关键差异。
结构同步不是“强制覆盖”,方向选错就删字段
navicat 17 的结构同步不会无脑把左边字段“塞进”右边表——它严格按源→目标单向生成 ddl。如果你把待更新的旧库拖到右侧,新库拖到左侧,点击部署后执行的会是 drop column 而不是 add column,真实删掉你本想保留的字段。
实操建议:
- 左侧必须是你「当前要改」的库(比如
test_old),右侧是「要对齐成什么样」的基准库(比如test_new) - 比对完成后,紧盯顶部状态栏文字:必须显示“将对
test_old应用以下更改”才说明方向正确 - 一旦发现写的是“将对
test_new应用…”,立刻关掉窗口重来,别点“部署”
字段级差异常被 COLLATE/CHARACTER SET 假阳性干扰
两个表字段名、类型、长度一模一样,但 Navicat 仍标为黄色“修改”,点开 DDL 比较 标签一看,只有 COLLATE utf8mb4_0900_as_cs 和 COLLATE utf8mb4_unicode_ci 的区别——这类元数据差异不改变语义,但会触发 ALTER TABLE ... CONVERT TO CHARACTER SET,可能锁表或引发隐式转换。
实操建议:
- 每条“修改”差异都点开,到底部
DDL 比较标签逐行核对,重点看CHARACTER SET、COLLATE、COMMENT、ENGINE - 确认无关紧要后,右键该差异项 → “忽略此项”;Navicat 不支持批量忽略或正则过滤,必须手动点
- 别图省事全选“忽略所有修改”,漏掉真实字段变更就麻烦了
只勾选“表”不够,视图/触发器/存储过程必须显式打开
默认结构同步只对比 TABLE 和 COLUMN,但实际升级中,一个视图少一列、触发器里引用了已删除字段、存储过程参数顺序变了,上线立刻报错。这些对象不会出现在“表结构”列表里,也不会被自动纳入比对范围。
实操建议:
- 在结构同步窗口点击“选项”或齿轮图标,勾选
View、Trigger、Stored Procedure、Function等全部高级对象 - 如果只同步某几张表,不要在主列表里取消勾选——而应在“比较设置”里限定对象范围,否则视图定义可能因依赖表未同步而失效
- 部署前务必人工检查
部署脚本标签里的完整 SQL,确认没有意外的DROP VIEW或CREATE OR REPLACE PROCEDURE
ADD COLUMN 默认值和位置不能靠自动推断
Navicat 生成的 ADD COLUMN 语句默认不带 AFTER 或 FIRST,也不自动补 DEFAULT 值。如果你依赖字段顺序或非空默认值,脚本执行后字段可能插在末尾、值为 NULL,跟预期不符。
实操建议:
- 点开每条
ADD COLUMN差异,在DDL 比较里确认目标 DDL 是否含AFTER xxx或DEFAULT 'xxx' - 若缺失,别指望 Navicat 自动补全——得手动编辑部署脚本,或回退到建表语句重新导出
- 生产环境部署前,必须在测试库跑一遍脚本,并用
SHOW CREATE TABLE对比最终结构


















