MYSQL:LOAD DATA INFILE后显示跳过的记录?

时间:2010-04-30 17:29:07

标签: sql mysql load-data-infile

在MySQL中,我使用了LOAD DATA LOCAL INFILE,效果很好。最后我得到一条消息:

Records: 460377  Deleted: 0  Skipped: 145280  Warnings: 0

如何查看已跳过的记录的行号? SHOW warnings不起作用:

mysql> show warnings;
Empty set (0.00 sec)

5 个答案:

答案 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"

当两个第一列是主键时。