结构同步是唯一安全变更表结构的路径,必须通过“工具→结构同步”进入,禁用“同步数据”和“删除不存在的对象”选项,删字段等操作需手动执行并核对SQL。

确认你用的是「结构同步」,不是「数据同步」或「数据传输」
很多人点错入口,以为在做结构变更,结果执行了数据覆盖。真正只动表结构的唯一路径是:工具 → 结构同步。如果看到「数据同步」界面里有「源表/目标表映射」「冲突处理方式」等字段级选项,说明已经进错功能了。数据传输更危险——它默认勾选「创建表」,会先 DROP TABLE 再重建,线上数据直接清空。
比对前必须关掉「同步数据」类选项,且不勾选「删除不存在的对象」
结构同步界面点击「比较」后,会进入差异预览页。这里有两个关键陷阱:
-
同步数据选项(旧版叫「同步记录」)必须未勾选——它一旦启用,Navicat 会在生成的 SQL 中混入INSERT或UPDATE语句 -
Drop objects not exist in source这个复选框,对「表」生效,但对「字段」完全无效;它也不会删索引、外键或默认约束——别指望它帮你清理冗余字段
如果你的目标只是加字段、改类型、增索引,就只保留「创建」和「修改」操作,其他全取消。
删字段、删索引、删外键必须手动处理,不能依赖结构同步自动生成
Navicat 的结构同步从不生成 ALTER TABLE ... DROP COLUMN 语句,即使源库已删字段,目标库仍保留。真要删,只能走这条链路:
- 右键目标表 →
设计表(不是「打开表」) - 选中要删的字段整行 → 按键盘
Delete键(Backspace无效) - 务必点
SQL 预览按钮,确认生成的是ALTER TABLE `t` DROP COLUMN `xxx` - 删之前查三处依赖:
SHOW INDEX、information_schema.KEY_COLUMN_USAGE、information_schema.COLUMNS中的EXTRA字段
跳过 SQL 预览=不知道 Navicat 底层到底要执行什么,尤其在线上环境,这是最常被跳过的一步。
部署前必须人工核对 DDL 脚本,特别是字符集、存储引擎、NOT NULL 约束
结构同步生成的脚本未必安全。常见翻车点:
- 源库用
utf8mb4_0900_as_cs,目标库是utf8mb4_general_ci,同步后中文排序异常 - 源库是
InnoDB,目标库误设为MyISAM,事务能力丢失 - 新增字段带
NOT NULL但没给DEFAULT,后续插入老数据时直接报错
这些细节不会在「差异列表」里高亮,只藏在 DDL比较 或 部署脚本 选项卡里。线上部署前,至少花两分钟扫一遍最终 SQL —— 尤其注意 MODIFY COLUMN 和 CHANGE COLUMN 的字段定义是否完整。











