Navicat跨平台同步时主键自增值不一致的根本原因是结构同步默认硬编码源库AUTO_INCREMENT值,忽略目标表实际最大ID;需手动关闭“Include AUTO_INCREMENT value”选项,并同步后手动重置AUTO_INCREMENT为MAX(id)+1。
navicat 跨平台同步(比如 macos → windows、linux → macos)后主键自增值不一致,根本原因不是平台差异本身,而是 navicat 在结构同步时默认把源库 auto_increment 值硬编码进 ddl,而目标库当前最大 id 完全被忽略——跨平台只是放大了这个问题的可见性。
AUTO_INCREMENT=12345 会被无条件执行Navicat 的「结构同步」只读取源表 CREATE TABLE 语句中的 AUTO_INCREMENT 字面值,不管目标表是否已有 20 万条数据、最大 ID 是 200001。它生成的同步脚本会包含类似:
ALTER TABLE `users` AUTO_INCREMENT = 12345;
这条语句在目标库执行时:
ERROR 1067 (42000): Invalid default value for 'id'
Include AUTO_INCREMENT value 默认开启且不记忆,每次同步都得手动关这个选项藏在「结构同步」→「选项」→「高级」面板里,名称是 Include AUTO_INCREMENT value,但它:
Duplicate entry '1' for key 'PRIMARY'
很多人第一次关了,第二次忘了,反复删表重试,其实只是重复踩同一个坑。
本地开发用 macOS,测试/预发部署在 Linux,生产在 Windows —— 这类场景下,目标库往往刚初始化或只有少量测试数据,AUTO_INCREMENT 值远低于源库。此时硬同步源库的自增值,冲突概率极高。
SELECT IFNULL(MAX(id), 0) FROM table_name;
ALTER TABLE table_name AUTO_INCREMENT = ?(? 替换为上一步结果 +1)TRUNCATE TABLE table_name 比 DELETE FROM 更快,且自动重置自增到 1最易被忽略的是:即使你关掉了 Include AUTO_INCREMENT value,MySQL 8.0+ 的 innodb_autoinc_lock_mode = 2(默认)仍会让批量插入行为不一致——同一份 SQL,在不同环境插入出来的 ID 序列可能不同。这不是 Navicat 的锅,但你得知道它存在。