必须先确认主键和字符集一致,否则Navicat会退化为低效全字段比对或误判差异;预览页底部网格显示真实差异,黄色高亮字段才可信,且需人工核对DELETE来源与字段映射。
点「Compare&Preview」前必须确认主键和字符集
预览功能不是万能的,它依赖底层比对结果。如果源库和目标库表没主键,navicat 会退化为全字段逐行比对,速度慢、结果乱,且无法准确定位差异行。更隐蔽的问题是字符集不一致——比如源库用 utf8mb4、目标库用 utf8,相同中文会被判定为不同,但预览界面完全不提示原因。
实操建议:
- 执行前先在两个库中运行
SHOW CREATE TABLE table_name,对比CHARACTER SET和COLLATE是否一致 - 检查主键:用
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'xxx' AND CONSTRAINT_NAME = 'PRIMARY';确认双方都有且仅有一个主键字段 - 若表无主键,临时加
ALTER TABLE xxx ADD PRIMARY KEY (id);(确保id唯一非空),同步完再删(如业务不允许)
预览页里看到「UPDATE 0 行」不等于没差异
预览统计数字只反映 Navicat 认为“需要执行”的操作,不是真实数据差异。例如,两行仅差一个 updated_at 字段,Navicat 默认把它归为「相同」,不计入 UPDATE 计数,但实际值确实不同。
关键动作在预览页底部网格:
- 点击表名后,底部显示源 vs 目标行数据,黄色高亮字段才是真实差异点
- 右键某行 → 「排除此项」可跳过该行同步,适合自动更新的时间戳或计数器字段
- 若发现大量行只差
updated_at或version,说明业务层已触发变更,通常不该同步——否则会覆盖业务逻辑
预览显示「DELETE N 行」时要立刻查来源
当预览页显示「将从目标库删除 N 行」,意味着这些行在源库中不存在。这不一定是错误,但必须人工确认是否属于以下情况:
- 源库近期执行了
DELETE FROM,但目标库未同步(正常) - 目标库被手动插入测试数据或脏数据(需清理)
- 源库有软删除逻辑(如
is_deleted = 1),但同步配置没过滤该条件(配置遗漏)
注意:Compare&Preview 不展示 WHERE 条件,所以无法区分「该删」和「误删」。唯一办法是点开对应表,在底部网格逐行核对主键值是否真不在源库中。
跳过预览直接点「Compare&Deploy」的风险
「Compare&Deploy」省掉预览步骤,直接执行同步。它适合已验证过的稳定任务,但首次使用或结构变更后绝对不要跳过预览。
容易踩的坑:
- 误勾选了「删除记录」选项,预览页能让你一眼看到将删哪些 ID;而直接部署后才发现删了生产订单
- 字段映射出错(比如源库
user_name被映射到目标库real_name),预览页底部网格会暴露字段错位,部署后才报Column 'real_name' cannot be null - 时区差异导致
DATETIME字段被标红,但你根本没注意到——预览页是唯一能直观看到字段级差异的地方
真正麻烦的不是同步失败,而是同步成功却改错了数据。预览页那几秒停留,换来的是对每一行变更的掌控感。别省。











