Navicat结构同步需严格区分源(左侧,待更新库)与目标(右侧,对齐基准库),否则DDL脚本方向错误;须手动检查COLLATE等元数据差异并忽略无关项;务必勾选视图/存储过程等高级对象;部署前须人工核查ADD COLUMN默认值及列位置。
结构同步窗口里选错源和目标,结果就反了
navicat 的 结构同步 功能默认以“左侧为源、右侧为目标”,但界面不显式标出“源/目标”字样,只写“数据库1”“数据库2”。一旦选反,生成的 ddl 脚本会把 test_new 当成要被修改的一方,而你真正想升级的是 test_old ——结果就是脚本删掉 test_new 的字段,而不是补全 test_old 的缺失项。
实操建议:
- 在
结构同步对话框中,先确认左侧数据库是你「当前要更新」的那个(比如旧库),右侧是「希望对齐」的那个(比如新库) - 比对完成后,看顶部状态栏是否显示“将对 [左侧库名] 应用以下更改”——这是唯一能快速验证方向是否正确的提示
- 如果发现方向错了,别点“部署”或“运行”,直接关掉重开,重新拖拽顺序
对比结果里“修改”类差异实际可能只是字符集或排序规则不同
常见现象:两个表字段名、类型、长度完全一致,但 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),但很多升级场景中,视图定义变更、触发器逻辑调整、存储过程参数增减才是真正影响功能的地方。如果只盯着“表结构”,上线后可能发现某个查询报错,追查才发现是视图 SELECT 列少了。
实操建议:
- 打开
结构同步后,在左下角找到“高级选项”或“更多对象”复选框(Navicat 17.1+ 版本位置在对话框底部) - 务必勾选
VIEW、PROCEDURE、TRIGGER、FUNCTION,否则它们压根不会参与对比 - 注意:勾选后对比耗时明显增加,尤其是含大量视图的库;可先取消勾选做一轮快速表结构扫描,再单独开一次只对比视图
导出的部署脚本不能直接执行,得先检查 AUTO_INCREMENT 和主键约束
Navicat 生成的部署 SQL 看似完整,但有两处容易埋雷:ALTER TABLE ... ADD COLUMN 语句默认不带 AFTER 位置指定,字段会加到末尾,可能破坏应用层对列序的隐式依赖;更危险的是,如果目标表已有数据,而新增字段没设默认值且不允许 NULL,脚本会直接报错中断。
实操建议:
- 点开
部署脚本标签后,不要直接点“运行”,先复制全文到新查询窗口,人工扫一遍 - 搜索
ADD COLUMN,确认每条都显式写了DEFAULT NULL或DEFAULT 'xxx',否则加字段前要先SET sql_mode = ''(仅限开发环境) - 搜索
MODIFY COLUMN或CHANGE COLUMN,检查是否有从INT改成BIGINT却没加NOT NULL的情况,这会导致 MySQL 自动补 0,而非报错











