必须点击同步对比窗口右上角“Generate SQL”按钮预览DDL脚本,而非直接点“Run”;生成后可编辑、保存并手动在Query中执行,但修改后的脚本无法反向导入同步任务。
同步前如何看到 Navicat 生成的 DDL 脚本?
navicat 的结构同步(structure synchronization)默认直接执行变更,不展示 sql。想预览脚本,必须手动触发「生成脚本」流程,而不是点「run synchronization」。
关键操作路径:在同步对比窗口中,点击右上角 Generate SQL 按钮(不是 Run)→ 选择目标数据库类型 → 点击 OK。此时弹出的窗口才是可编辑的完整 DDL 脚本。
- 如果误点了
Run,变更已提交,无法回退(除非有备份或 binlog) -
Generate SQL生成的脚本默认包含IF NOT EXISTS和DROP ... IF EXISTS,但不会自动加事务包装,需手动补BEGIN TRANSACTION/COMMIT(尤其涉及多表变更时) - 脚本中字段顺序、约束定义顺序可能与源库不一致,Navicat 按自身解析逻辑重排,不是 bug,但会影响可读性
为什么修改生成的脚本后不能直接“再同步”?
Navicat 不支持把人工修改后的 SQL 脚本反向导入同步任务。一旦你点击了 Generate SQL 并保存为 .sql 文件,后续执行就得靠外部工具(如 Query 工具)运行,同步窗口本身不再感知你的修改。
这意味着:你改完脚本 → 复制粘贴到 Query 标签页 → 手动执行 → 再次打开同步向导时,它仍会按原始差异重新计算,不会记住你上次改过的逻辑。
- 常见误操作:在
Generate SQL窗口改完直接点Run—— 这个按钮实际是执行原始未修改的差异,不是你刚编辑的内容 - 真正生效的只有复制粘贴到
Query中执行的那一版 - 若需反复调整,建议把生成的脚本存为本地文件,每次同步前用 diff 工具比对新旧版本,避免漏改
哪些结构变更会被 Navicat 自动忽略或无法生成安全脚本?
Navicat 对某些高风险操作采取保守策略:不生成对应 DDL,或生成不可靠语句。这不是界面卡顿,而是设计限制。
-
ALTER TABLE ... MODIFY COLUMN类型变更(如VARCHAR(50)→VARCHAR(20))可能被跳过,或生成带数据截断风险的语句,需人工确认是否加USING子句或分步处理 - 主键/唯一索引重命名(MySQL 5.7+ 支持
RENAME INDEX),但 Navicat 常降级为DROP + CREATE,导致外键依赖中断 - 分区表结构调整、全文索引变更、Generated Column 修改,基本不进同步列表,也不会出现在
Generate SQL输出里
这类情况必须退出同步向导,手动写 SQL,并在 Query 中验证执行顺序和锁影响。
不同数据库类型对脚本生成的影响
Navicat 的 Generate SQL 结果高度依赖你在同步向导里选的目标数据库类型(如 MySQL 8.0 vs MySQL 5.6),而非当前连接的实际版本。
- 选错版本会导致语法错误:比如选了
MySQL 8.0却同步到5.7实例,脚本里可能出现JSON_TABLE或不带引号的保留字 - PostgreSQL 下,
GENERATED ALWAYS AS列的同步脚本在 12+ 和 10– 版本间行为不同,Navicat 不做兼容降级 - SQL Server 的
IDENTITY列变更,若目标库兼容级别低于 130,生成的SEED/INCREMENT语句可能报错
最稳妥做法:同步前右键目标连接 → Connection Properties → 确认 Server Version 设置准确,再启动同步向导。


















