Navicat 17的“同步到模型”按钮仅在新建模型时有效,已有模型点击无响应,不生成任何脚本;唯一可生成SQL脚本的操作是「工具→正向工程」,支持预览与导出,但需人工审核并处理兼容性、保留字、约束清理等问题。

“同步到模型”按钮根本不会生成脚本
Navicat 17 的「同步到模型」右键菜单项仅在新建模型时有效,已有模型点击无响应——它不触发任何脚本生成行为。所谓“模型同步”,实际只有两种路径:反向工程(库→模型)和正向工程(模型→库),而后者才是唯一能输出 SQL 脚本的操作入口。
正向工程是唯一可控的脚本生成方式
要让模型变更落地为可审核的 SQL,必须走「工具 → 正向工程」流程。该操作默认不执行,只预览语句,且支持导出:
- 勾选目标表后,点击「下一步」进入预览页,所有
CREATE TABLE、ALTER TABLE、DROP INDEX等语句都会列出 - 点击右下角
Save As SQL File...可导出为 .sql 文件,供人工审查或纳入 CI 流程 - 若模型中删了字段但目标库还存着数据,预览会包含
DROP COLUMN,但不会自动加IF EXISTS—— 需手动补全以避免执行失败 - 外键约束名若在模型里被重命名,正向工程会生成新约束,但旧约束不会被自动删除,得额外写
DROP FOREIGN KEY
容易忽略的预览陷阱
SQL 预览内容高度依赖当前模型状态,且极易被误判为“已生效”:
- 预览中的
MODIFY COLUMN和CHANGE COLUMN行为不同:只改类型用前者,改名字必触发后者——后者会重建字段,可能锁表更久 - 字段含空格或保留字(如
order)时,预览自动加反引号:`order`,但若目标库是 SQL Server,应为方括号:[order],需手动替换 - 预览不检查跨库兼容性:MySQL 的
JSON类型在 PostgreSQL 正向工程中会变成TEXT,但不会警告 - 保存模型后,预览内容立即清空;关掉再打开,必须重新点「正向工程」才能再次生成
为什么不能跳过正向工程直接“同步”
因为 Navicat 17 没有中间态:它不维护模型与库之间的差异快照,也不记录哪次修改对应哪条 DDL。所谓“同步”,本质是拿模型当前结构全量覆盖目标库结构。如果你跳过预览直接执行,等于把整套 DDL 当作可信命令一次性跑完——而真正危险的不是语法错,是那些没出现在预览里的隐式影响,比如字符集变更导致索引失效、TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 在 MySQL 5.6 下不被支持却仍显示在预览里。


















