navicat的“忽略重复记录”仅在mysql中有效且需满足4个前提:目标表存在主键或唯一索引、导入类型为“追加”、字段映射页手动勾选、源字段与目标字段严格对应;sql server不支持该功能,csv/txt/json导入中的“跳过错误”不等同于跳过重复。
忽略重复记录 不是全局开关,它只在特定数据库、特定模式、特定表结构下才真正生效。直接勾选“跳过重复记录”大概率没反应——你得先满足它的硬性条件。
MySQL 中「忽略重复记录」必须满足的 4 个前提
Navicat 在 MySQL 下的「忽略重复记录」实际翻译为 INSERT IGNORE,它不是 Navicat 自己做的逻辑过滤,而是依赖 MySQL 的约束机制判断“什么是重复”。不满足以下任一条件,选项会灰色不可用,或点了也无效:
- 目标表必须已存在,且至少有一个
PRIMARY KEY或UNIQUE索引(可用SHOW CREATE TABLE table_name验证) - 导入类型必须选「追加」,不能是「更新」或「替换」——后两者会隐藏该选项
- 导入向导第 2 步(字段映射页)右下角要手动勾选「忽略重复项」(中文版文字),不是在「高级」里找
- 源 CSV/Excel/TXT 的主键/唯一字段,必须与目标表对应字段**严格映射**:字段名大小写、下划线、空格都要一致;若映射错位(比如把 source.id 映射到 target.name),Navicat 就无法识别冲突依据
SQL Server 导入时「忽略重复记录」根本不存在
Navicat 对 SQL Server **完全不支持** INSERT IGNORE 或等效语法。你在导入向导里看到的「跳过重复记录」复选框,要么是灰色禁用,要么点了也报错(Error 2627)。这不是配置问题,是底层能力缺失:
- SQL Server 没有原生跳过主键冲突的 INSERT 语义,Navicat 15 只能走
MERGE或逐行UPDATE - 想避免中断,唯一可靠路径是:导入向导第 2 步 → 把操作从
Insert改为Update→ 手动点击主键列右侧的「匹配」复选框(仅勾选不够,必须点一下激活) - 如果目标表有多个唯一约束(如 email + phone 联合唯一),Navicat 不支持多条件匹配,得提前建视图或用 T-SQL 写
MERGE语句导入
CSV/JSON/TXT 导入时,“跳过错误” ≠ “跳过重复”
很多人混淆了两个概念:跳过重复记录(针对主键/唯一键冲突)和 跳过错误记录(针对单行数据格式问题)。后者在 CSV/TXT 导入中确实存在,但作用范围极窄:
- CSV 导入:最后一步「Options」标签页勾选
Skip errors and continue importing,只对字段类型不匹配(如字符串填进 INT 列)、空值插 NOT NULL 列等生效;对主键重复、外键失败、UTF-8 四字节 emoji 插入 utf8 表等,完全无效 - JSON 导入:Navicat **没有**任何跳过选项。一旦某行 JSON 格式非法(如单引号、BOM 头、尾部逗号),整个导入立即终止,且不报具体行号。必须用
jq或 Python 预校验,或改用命令行分批导入 - TXT 导入:若无表头,Navicat 默认按列位置映射,第一行会被当数据塞进主键列导致冲突——此时应手动调整字段顺序,或顶部加占位表头并勾选「第一行包含字段名」
真正可控的替代方案,比依赖 GUI 更可靠
图形界面的“忽略”是快捷入口,不是容错保险。当数据量大、schema 复杂或错误类型混合时,这些选项容易失效或行为难预测。更稳的做法是绕开它:
- MySQL:用
LOAD DATA INFILE 'file.csv' IGNORE INTO TABLE t1——IGNORE关键字由服务端执行,行为明确,且支持复合唯一索引 - 通用清洗:先导出建表语句,在目标表临时加
UNIQUE索引;再用 Navicat 导入到临时表;最后用INSERT IGNORE SELECT DISTINCT ... FROM temp_table去重入库 - 跨库/复杂逻辑:别在 Navicat 里硬扛。用 Python 脚本读源文件,对每条记录做
json.loads()或pandas.DataFrame.drop_duplicates(),再批量executemany()插入——你能看见哪一行被跳过,也能加日志、重试、分片
真正容易被忽略的点是:Navicat 的「忽略」只响应数据库引擎返回的 ERROR 1062,而不会处理解析阶段失败(如 JSON 格式错)、连接层中断(如超时)、或权限类错误(如 INSERT 无权限)。这些都得靠前置检查和外部工具兜底。











