根本原因是增量逻辑未闭环:WHERE条件未动态更新、主键映射错误或误启全量覆盖选项;Navicat不支持NOW()等动态条件,须通过脚本生成带当前时间的.ncx文件并调用命令行执行。
Navicat 定时同步导致数据重复,根本原因不是“同步太勤”,而是增量逻辑没闭环——WHERE 条件没更新、主键映射错、或误启了全量覆盖动作。靠勾选“跳过重复”只能掩盖问题,不能根治。
典型表现是目标表里出现两份相同主键的订单、用户或日志,时间戳却不同。这不是 Navicat bug,而是以下任一条件没满足:
WHERE 条件写死(如 created_at > '2026-07-20 00:00:00'),但你没在每次同步后手动改这个时间值Delete records 或 Update records,但源/目标主键映射不一致,导致 Navicat 把本该更新的行判成新插入Navicat 不支持变量或函数式条件(如 created_at > NOW() - INTERVAL 1 DAY),所以必须靠外部手段注入动态时间。实操路径只有一条:用脚本生成带当前时间的 .nsx/.ncx 文件,再调用命令行执行。
WHERE 字符串,用 XML 工具替换 .nsx 文件里的 <where>...</where> 节点,再调 navicat.exe -sync
sed -i "s/created_at > '[^']*'/created_at > '$(date -d 'yesterday' +'%Y-%m-%d %H:%M:%S')'/g" task.ncx
哪怕表结构完全一样,只要 Key Mapping 没对准主键字段,Navicat 就会退化成“无脑插入”。预览时看到大量 Insert 行,但你知道这些记录在目标库明明存在?八成是这里出了问题。
Key Mapping 页面,确认每张表的「Key」列只勾选了真正的主键字段(如 id),且类型一致(INT 对 INT,不是 BIGINT 对 INT)Difference 标签页,点开某张表,看被标为 Insert 的行——如果主键值已在目标库存在,说明 Key Mapping 失效,立刻回退修正表面看是“同步数据”,实际某些开关一开,等于主动邀请重复发生。
Synchronize data(在结构同步向导里):这是最隐蔽的坑——你以为在同步表结构,其实 Navicat 在背后悄悄执行 INSERT,直接撞上主键约束Delete records 但源库删得慢:比如源库某条记录凌晨两点被删,但同步任务三点才跑,此时 Navicat 会先 Insert 进去,再 Delete 掉,中间状态就是重复Remove records not exist in source:这会导致目标库历史数据被清空,下次同步又全量灌入,看起来像“重复”,其实是反复重建utf8mb4,目标库 latin1):中文字段入库变乱码,Navicat 比对时认为“内容不同”,强制 Update 或 Insert 新行真正稳定的定时同步,从来不是配完就扔给 Navicat 自己跑;它需要你每天检查一次 WHERE 时间戳是否更新、预览里 Insert 行数是否异常上涨、以及日志里有没有 Duplicate entry 被静默跳过——这些细节,才是重复问题藏身的地方。