在 MySQL 中,我使用LOAD DATA LOCAL INFILE
了它工作正常。最后,我收到如下消息:
Records: 460377 Deleted: 0 Skipped: 145280 Warnings: 0
如何查看被跳过的记录的行号?SHOW warnings
不起作用:
mysql> show warnings;
Empty set (0.00 sec)
在 MySQL 中,我使用LOAD DATA LOCAL INFILE
了它工作正常。最后,我收到如下消息:
Records: 460377 Deleted: 0 Skipped: 145280 Warnings: 0
如何查看被跳过的记录的行号?SHOW warnings
不起作用:
mysql> show warnings;
Empty set (0.00 sec)
如果没有警告,但跳过了某些行,则可能意味着跳过的行的主键重复。
找出重复项的最简单方法是在 excel 中打开本地文件并在主键列上执行重复删除以查看是否有任何重复项。
您可以创建一个临时表删除主键项,以便它允许重复,然后插入数据。
构造一个 SQL 语句,如
select count(column_with_duplicates) AS num_duplicates,column_with_duplicates
from table
group by column_with_duplicates
having num_duplicates > 1;
这将向您显示具有冗余的行。另一种方法是只转储实际插入表中的行,然后针对原始行运行文件差异命令以查看哪些行未包含在内。
对于任何偶然发现这一点的人:
另一种选择是执行 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 用户。
当不满足任何数据库约束时,将跳过记录。检查常见的,如
我使用 bash 命令行在 csv 文件中查找重复的行:
awk -F\, '{print $1$2}' /my/source/file.csv| sort -n| uniq -c| grep -v "^\ *1"
当前两列是主键时。