navicat 同步不支持自动新增字段或注入来源标识,需手动在目标表添加 source_origin 字段(如 enum 类型),并通过导出 sql 脚本手动修改 insert 语句以写入来源值,同时需协调约束、语义与团队共识。
navicat 本身不支持在同步过程中自动新增字段或改写 insert 语句来加来源标识列——它只比对、生成、执行 sql,不会主动修改表结构或注入业务逻辑。想在合并后知道某条记录来自哪个库,得靠你提前设计好字段,并控制同步行为。
同步前必须手动在目标表加 source_origin 字段
Navicat 不会帮你 ALTER TABLE。如果目标表没有 source_origin(或类似字段),同步时就不可能写入来源信息。
- 在目标库执行:
ALTER TABLE users ADD COLUMN source_origin ENUM('dev', 'test', 'prod') NOT NULL DEFAULT 'dev'; - 别用 VARCHAR 存来源名——ENUM 更安全,且 Navicat 在字段映射里能更稳定识别类型
- 确保源库对应表也有该字段(哪怕值为空),否则 Navicat「字段映射」可能跳过它,导致同步时被忽略
用自定义 SQL 脚本替代图形化同步
图形向导里的「数据同步」无法给每条 INSERT 加 VALUES(..., 'dev') 这种硬编码值。你得绕开它,走 SQL 导出 + 手动增强的路径:
- 在同步向导最后一步,勾选
Generate synchronization SQL script,保存为sync_users.sql - 用文本编辑器打开,把所有
INSERT INTO users (id, name, email)改成INSERT INTO users (id, name, email, source_origin) - 再把每行
VALUES (1, 'Alice', 'a@b.com')改成VALUES (1, 'Alice', 'a@b.com', 'dev') - 如果源库字段里真有来源信息(比如视图里已 SELECT 'dev' AS source_origin),就不用手改,直接同步即可
避免外键或唯一约束因 source_origin 引发新冲突
加了 source_origin 后,如果原表有唯一索引(比如 UNIQUE KEY (email)),现在变成多源数据共存,email 可能重复但 source_origin 不同——这时唯一约束会报错。
- 要么删掉原唯一索引,换成
UNIQUE KEY (email, source_origin) - 要么同步前确认:不同来源的
email确实不重叠;若重叠,就得在 SQL 脚本里加ON DUPLICATE KEY UPDATE逻辑 - Navicat 的「Skip duplicate key errors」只跳过主键/唯一键冲突,不会帮你做字段级去重或合并
多人多源合并时,source_origin 值必须人工约定且不可变
这个字段不是 Navicat 自动生成的元数据,而是你业务规则的一部分。一旦设为 'dev',就不能在目标库手动 UPDATE 成 'test',否则下次同步会因主键匹配而覆盖或冲突。
- 所有团队成员必须统一理解:
source_origin = 'dev'意味着“这条数据最初由开发环境产生”,不是“当前从 dev 同步过来” - 禁止在目标库直接 INSERT 或 UPDATE
source_origin字段——它应只由同步脚本写入 - 如果后期要追加新来源(如
'staging'),必须先改表结构、更新所有同步脚本,再跑同步
真正麻烦的从来不是加一列,而是让所有人对这一列的语义、生命周期和修改边界达成一致。Navicat 不管这些,它只管执行你给它的 SQL。











