SQL预览不是真实DDL,仅为GUI操作的翻译结果,不校验语法、不补全默认值、不反映真实解析,外键名可能截断,需导出“转储SQL文件”后人工走查。
SQL预览不等于真实DDL,别直接拿它走查
navicat 的「sql预览」只是 gui 操作的即时翻译结果,不是 mysql 或 postgresql 实际执行的语句。它不校验语法、不模拟解析、不补全隐式默认值(比如 engine=innodb 在 mysql 8.0+ 中常被省略),也不保证外键名完整(老版本可能截断)。你看到的,大概率不是上线前需要人工审核的最终 ddl。
结构同步前必须确认源库和目标库方向
结构同步窗口里没标“源/目标”,只写“数据库1”“数据库2”,但逻辑是左侧为待更新库(你要改的那个),右侧为基准库(你想对齐的那个)。方向选反,生成的脚本就是反向的——比如该给旧库加字段,结果却删了新库的字段。
- 看顶部状态栏是否显示“将对
[左侧库名]应用以下更改”,这是唯一快速验证方向的方式 - 比对完先别点“部署”,务必手动检查预览 SQL 里有没有
DROP COLUMN或RENAME TO这类高危操作 - 如果发现方向错了,关掉重开,重新拖拽数据库顺序——不能中途反转
预览里出现 INSERT 就说明不是纯结构同步
结构同步只生成 ALTER TABLE、CREATE INDEX 等 DDL。一旦预览里看到 INSERT INTO,说明你误启了「Synchronize data」选项,或者同步向导 Step 1 的「Options」页勾选了数据同步。
- 主键冲突错误
Duplicate entry '1' for key 'PRIMARY'一定来自数据写入,和结构无关 - 检查「Options」页:确保未勾选
Synchronize data - 预览 SQL 中只要有一行
INSERT,就不是结构同步,得退回重配
忽略 COLLATE/CHARSET 差异要手动逐条点开
两个表字段完全一样,但 Navicat 标黄“修改”,点开 DDL 比较标签一看,只是 COLLATE utf8mb4_0900_as_cs 和 COLLATE utf8mb4_unicode_ci 不同——这种差异不影响查询逻辑,但会触发 ALTER TABLE ... CONVERT TO,可能锁表或引发隐式转换。
- 必须点击每条差异项,在底部「DDL 比较」标签里逐行核对
CHARACTER SET、COLLATE、COMMENT、ENGINE - 确认无关后,右键该差异 → 「忽略此项」;Navicat 不支持批量忽略或按规则过滤
- 视图、存储过程、触发器默认不参与对比,要手动勾选「包含高级对象」,否则上线后可能因视图字段缺失直接报错


















