最可靠方法是导入前用SQL查重复行:先确定重复字段组合,再用GROUP BY + HAVING COUNT(*) > 1检测;Navicat“忽略重复项”仅依赖目标表已有PRIMARY KEY或UNIQUE索引,且不适用于SQL Server。
导入前用 SQL 查重复行最可靠
navicat 本身没有“导入前自动扫描重复”的功能,所谓“检查是否存在重复行”,必须靠你手动执行查询。核心逻辑是:先确认哪几个字段组合定义“重复”,再用 group by + having count(*) > 1 检出。比如目标表有唯一约束 unique(email, phone),那就得查这两列的组合重复:
SELECT email, phone, COUNT(*) FROM users GROUP BY email, phone HAVING COUNT(*) > 1;- 如果只按单字段查(如只查
email),可能漏掉复合唯一场景下的真实冲突 - 结果为空才代表“可安全追加”;只要返回任意一行,就说明源数据里已有违反约束的记录
- 注意字符集影响:若源 CSV 是 UTF-8 而目标表是
utf8mb4,emoji 或某些生僻字可能导致看似相同实则二进制不同的“假重复”,需统一COLLATION后再比
导入向导里勾选“忽略重复项”不等于“已检查”
很多人误以为勾上「忽略重复项」就等于 Navicat 帮你检查完了——其实它只是把冲突交给 MySQL 的 INSERT IGNORE 处理,且仅在满足硬性条件时才生效:
- 目标表必须已存在
PRIMARY KEY或UNIQUE索引(用SHOW CREATE TABLE table_name验证) - 导入类型必须是「追加」,不能是「更新」或「替换」(后两者直接隐藏该选项)
- 字段映射页右下角必须手动勾选「忽略重复项」,不是在「高级」里找
- 源文件字段名(如
user_id)和目标表字段名(如USER_ID)大小写/下划线必须完全一致,否则 Navicat 认为“无法匹配”,跳过逻辑失效
导入后从日志里反查被跳过的重复行
即使开了「忽略重复项」,Navicat 也不会在预览页告诉你哪几条被跳了。真正记录跳过行为的地方是同步完成后的「信息日志」页:
- 日志里每条被跳过的记录都会带警告:
Duplicate entry '105' for key 'PRIMARY' - 这个警告默认是黄色、折叠状态,容易被忽略——务必点开「信息日志」,手动搜索
Duplicate entry - 搜到 ID 后,回到源库和目标库分别查该 ID 对应的整行数据,确认是否真属冗余(比如测试数据未清理)还是业务上本该保留
- 注意:日志不区分“因主键冲突跳过”和“因唯一索引冲突跳过”,得结合
SHOW CREATE TABLE看具体是哪个 key 触发的
SQL Server 用户别指望“忽略重复项”
Navicat 对 SQL Server 完全不支持 INSERT IGNORE 语义。你在导入向导里看到的「跳过重复记录」复选框,要么灰色禁用,要么点了报错 Error 2627(违反唯一约束):
- 唯一可行路径是:导入向导第 2 步 → 把操作从
Insert改为Update→ 手动点击主键列右侧的「匹配」复选框(光勾选没用,必须点一下激活) - 如果目标表有多个唯一约束(比如
email和phone各自独立唯一),Navicat 不支持多条件匹配,得提前建视图或手写MERGE语句 - CSV/TXT 导入中的「跳过错误」只管字段类型不匹配、空值插 NOT NULL 列等,对主键重复完全无效


















