navicat无法自动只同步新增字段而不影响数据:结构同步需禁用auto_increment同步以防主键冲突,数据同步须手动忽略新字段或配置where条件与更新策略,并确认时区一致。
navicat 本身不能“只同步新增字段而不影响数据”——结构同步和数据同步是两个完全独立的操作,混用会导致字段丢失或主键冲突。
结构同步时新增字段必须关掉 AUTO_INCREMENT 同步
很多人点「结构同步」后发现目标表数据还在,但下次 INSERT 就报主键冲突,问题出在 AUTO_INCREMENT 被强行覆盖。Navicat 默认把源表的 AUTO_INCREMENT=12345 当作结构一部分同步过去,哪怕目标表已有 2 万条记录。
- 进「结构同步」→「选项」→ 点右下角「高级」→ 取消勾选
AUTO_INCREMENT - 同理,如果目标表有注释、字符集、存储引擎等差异但你不想动,也在同一位置取消对应项
- MySQL 8.0+ 还要注意
innodb_autoinc_lock_mode设置,它会影响后续插入 ID 的连续性,和 Navicat 无关但会放大同步后的问题
新增字段后千万别直接跑「数据同步」
结构同步完新加了 is_verified TINYINT DEFAULT 0,立刻点「数据同步」?危险。Navicat 默认会对所有字段做比对和写入,而新字段在目标表是 NULL 或默认值,在源表可能有真实值,结果就是把整张表的 is_verified 全刷成 0 或 NULL。
- 必须进「数据同步」→「表映射」→ 点开该表右侧
Options→ 勾选Ignore columns→ 把新字段加进去 - 或者更稳妥:在「字段映射」界面取消勾选
Match fields by name,手动确认每一列连线,避免 Navicat 把created_at错连到新字段上 - 如果新字段不允许为 NULL 且没设默认值,同步会直接失败,得先在目标表执行
ALTER TABLE ... MODIFY is_verified TINYINT DEFAULT 0
想让新字段也带数据?得手动加 WHERE 条件 + 明确更新策略
比如你新加了 source_system VARCHAR(20),只想给最近 100 条记录填值,而不是全表更新——Navicat 不会自动识别“这是新字段要特殊处理”,你得自己控制范围和行为。
- 在「数据同步」→「表映射」→ 该表的
Options→ 勾选Use WHERE condition,填id > 99000或created_at > '2026-07-25 00:00:00' - 同步类型选
Insert and update records(不是仅插入),否则新字段根本不会写入已有行 - 进「高级选项」→「冲突处理」必须设为
Update existing records,否则即使条件匹配,Navicat 也只会跳过而非更新 - 时间字段务必确认源库和 Navicat 客户端时区一致,否则
created_at > '2026-07-25'在 CST 客户端下实际查的是 UTC 时间,漏掉 8 小时数据
最常被忽略的一点:Navicat 没有“智能感知字段新增”的能力。每次加字段后,结构同步和数据同步的配置都要重审一遍,尤其是 Ignore columns 和 AUTO_INCREMENT 这两项,不手动关,它就默认同步。











