结构同步中“比对自动递增值”必须手动关闭,否则navicat会将源库auto_increment值硬编码进alter语句,导致目标表主键重置、插入冲突;关闭后仍需检查ddl比较面板并手动忽略残留差异,且直连执行时须确认“改变对象的sql”中未勾选修改自增值。

结构同步里“比对自动递增值”必须手动关掉
Navicat 默认会把 AUTO_INCREMENT 值当作结构差异的一部分,哪怕两个表字段、索引、字符集完全一致,只要自增值不同(比如源是 1001,目标是 500),就会标为黄色“修改”,并生成 ALTER TABLE ... AUTO_INCREMENT = 1001 这类语句。这在生产环境极危险——可能重置主键起点,引发插入冲突或跳号。
实操建议:
- 打开结构同步窗口后,点右上角 Options → 找到
Compare settings标签页 - 取消勾选
比对自动递增值(MySQL 版本下明确显示此项;其他数据库如 PostgreSQL 对应的是比对序列) - 顺手检查是否也勾选了
比对字符集和比对排序规则——这两项若不关,也会触发无关 DDL - 保存设置后,必须重新点击
对比,旧的差异列表不会自动刷新
DDL 比较面板里仍出现 AUTO_INCREMENT 怎么办?
即使关了“比对自动递增值”,某些场景下 DDL 比较仍会显示 AUTO_INCREMENT=xxx 差异:比如源库用 mysqldump --no-data 导入过,建表语句里硬编码了该值;或者 Navicat 读取 SHOW CREATE TABLE 时原样带出。这不是 bug,而是它忠实还原了元数据。
实操建议:
- 每条标黄的“修改”项,务必点开底部
DDL 比较面板,确认差异是否真的只有AUTO_INCREMENT一行 - 如果是,右键该行 →
忽略此项;Navicat 不支持正则或批量忽略,只能逐条点 - 别依赖“忽略注释”或“忽略表统计信息”选项——它们对
AUTO_INCREMENT无效 - 如果大量表都存在该问题,说明源库建表方式不规范,建议后续统一用
SHOW CREATE TABLE+ 手动删AUTO_INCREMENT=段落来维护脚本
为什么关了选项还生成 ALTER TABLE 修改自增?
常见错误现象:选项已关,但部署时仍执行 ALTER TABLE t_user AUTO_INCREMENT = 2000。根本原因不是同步逻辑错,而是你点了“运行”而非“保存到文件”,且目标类型选成了数据库连接——Navicat 在直连执行模式下,会尝试补全所有可识别的元数据变更,包括它认为“应该同步”的自增值。
实操建议:
- 若只想验证结构差异,目标一定选
保存到文件,再人工审阅 SQL - 若必须直连执行,先在
Options里确认改变对象的 SQL下方没有勾选修改自动递增值(部分版本此选项独立于比对设置) - 执行前看预览 SQL 的第一行是否含
AUTO_INCREMENT;有就退回,别点部署 - 线上环境严禁用“遇到错误继续”选项——自增修改失败常伴随锁表,且错误提示模糊(如
ERROR 1022)
Options 里“改变对象的 SQL”子项和目标类型。两者不一致时,以目标类型为准。











