在MySQL中,我使用了LOAD DATA LOCAL INFILE
,效果很好。最后我得到一条消息:
Records: 460377 Deleted: 0 Skipped: 145280 Warnings: 0
如何查看已跳过的记录的行号? SHOW warnings
不起作用:
mysql> show warnings;
Empty set (0.00 sec)
答案 0 :(得分:10)
如果没有警告,但跳过某些行,那么可能意味着主要密钥被重复用于跳过的行。
查找重复项的最简单方法是在excel中打开本地文件并在主键列上执行重复删除,以查看是否存在重复项。
答案 1 :(得分:5)
您可以创建一个临时表来删除主键项,以便它允许重复,然后插入数据。
构建类似
的SQL语句select count(column_with_duplicates) AS num_duplicates,column_with_duplicates
from table
group by column_with_duplicates
having num_duplicates > 1;
这将显示有冗余的行。另一种方法是直接转储实际插入表中的行,并对原始文件运行文件差异命令,以查看哪些未包含在内。
答案 2 :(得分:3)
对于任何磕磕绊绊的人:
另一种选择是进行SELECT INTO并对两个文件进行区分。例如:
LOAD DATA LOCAL INFILE 'data.txt' INTO TABLE my_table FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\r' IGNORE 1 LINES (title, desc, is_viewable);
SELECT title, desc, is_viewable INTO OUTFILE 'data_rows.txt' FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r' FROM my_table;
然后执行FileMerge(在Mac OS X上)data.txt data_rows.txt以查看差异。如果您在执行SELECT INTO时收到拒绝访问错误,请确保:
GRANT FILE ON *.* TO 'mysql_user'@'localhost';
flush privileges;
作为mysql客户端的root用户。
答案 3 :(得分:1)
当不满足任何数据库约束时,将跳过记录。检查像
这样的常见内容答案 4 :(得分:1)
我使用bash命令行查找csv文件中的重复行:
awk -F\, '{print $1$2}' /my/source/file.csv| sort -n| uniq -c| grep -v "^\ *1"
当两个第一列是主键时。