csv导入前必须删除重复行,因phpmyadmin无去重功能,重复数据会导致主键冲突错误;推荐用文本编辑器排序后手动删重、awk多字段去重、insert ignore或replace into(慎用)、load data infile+ignore等方案。
csv导入前必须删掉重复行,phpmyadmin本身不 dedupe
phpmyadmin 没有“去重后导入”功能,它只是按行执行 insert。如果你的 csv 里有两条 id=123,name="alice",它就会尝试插两次,第二次必然报 #1062 - duplicate entry '123' for key 'primary'。所谓“避免重复”,第一步永远是清洗 csv 本身。
实操建议:
- 用 VS Code 或 Notepad++ 打开 CSV,全选 → 排序(菜单:Edit → Line Operations → Sort Lines Lexicographically Ascending),再手动删相邻重复行;或用命令行:
sort -u input.csv > deduped.csv - 如果重复依据是多个字段(如
email+phone),别用简单排序,改用awk -F, '!seen[$2,$3]++' input.csv > deduped.csv(假设 email 是第2列、phone 是第3列) - 导出源头若为 Excel,切勿用“删除重复项”功能后再另存为 CSV——Excel 会重排行序、丢失原始格式;应先用文本编辑器确认 deduped.csv 的首行仍是纯字段名,且无 BOM
导入时用 INSERT IGNORE 替代普通 INSERT(仅限 SQL 格式)
CSV 格式导入不支持 IGNORE 语义,但如果你能把 CSV 转成 SQL(例如用 Python pandas 或在线工具生成),就能绕过 phpMyAdmin 的限制。
关键点:
- 生成的 SQL 必须是单行单
INSERT,不能是INSERT INTO t VALUES (),(),()这种批量格式——phpMyAdmin 对批量语句里的IGNORE支持不稳定 - 全局替换
INSERT INTO `table_name`为INSERT IGNORE INTO `table_name`,确保每条语句都带IGNORE - 目标表必须已有主键或唯一索引,否则
IGNORE不生效;UNIQUE KEY `orderNo`这类约束才管用,普通索引不行
用 REPLACE INTO 替代 INSERT(慎用)
REPLACE INTO 本质是先 DELETE 再 INSERT,适用于需要更新旧记录的场景,但会改变自增 ID 并触发外键级联操作——不是“跳过”,而是“覆盖”。
容易踩的坑:
- 如果表有
AUTO_INCREMENT字段,REPLACE会导致 ID 递增,哪怕逻辑上只是更新同一行 - 外键设了
ON DELETE CASCADE?那关联记录会被连带删掉,不是所有业务都能接受 - CSV 转 SQL 时,字段顺序必须和
CREATE TABLE完全一致,否则REPLACE INTO t(col1,col2) VALUES (v1,v2)可能写错列
真正可靠的方案:用 LOAD DATA INFILE + IGNORE
这是 MySQL 原生命令,比 phpMyAdmin 解析 CSV 稳定十倍,且原生支持跳过重复行。前提是文件得放在数据库服务器本地,且你有 FILE 权限。
操作步骤:
- 把清洗后的 CSV 上传到服务器某个路径,比如
/var/lib/mysql-files/import.csv - 在 phpMyAdmin 的 SQL 标签页执行:
LOAD DATA INFILE '/var/lib/mysql-files/import.csv' INTO TABLE `table_name` FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;
- 加
IGNORE 1 ROWS跳过标题行;加REPLACE或IGNORE关键字控制冲突行为(IGNORE跳过,REPLACE覆盖)
最常被忽略的是权限和路径:MySQL 默认只允许读取 secure_file_priv 指定目录下的文件,执行 SHOW VARIABLES LIKE 'secure_file_priv'; 查真实路径,别硬写 /tmp。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











