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)

Ответ 1

Если не было никаких предупреждений, но некоторые строки были пропущены, это может означать, что первичный ключ был дублирован для пропущенных строк.

Самый простой способ найти дубликаты - открыть локальный файл в excel и выполнить дублирующее удаление в столбце первичного ключа, чтобы узнать, есть ли какие-либо файлы.

Ответ 2

Вы можете создать временную таблицу, удаляющую элементы первичного ключа, чтобы она позволяла дублирование, а затем вставлять данные.

Создайте инструкцию SQL, например

select count(column_with_duplicates) AS num_duplicates,column_with_duplicates
from table
group by column_with_duplicates
having num_duplicates > 1;

Это покажет вам строки с избыточностью. Другой способ состоит в том, чтобы просто выгрузить строки, которые были фактически вставлены в таблицу, и запустить команду отличия файлов от оригинала, чтобы увидеть, какие из них не были включены.

Ответ 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;

Как пользователь root в клиенте mysql.

Ответ 4

Записи будут пропущены, когда любое ограничение базы данных не будет выполнено. Проверьте общие, такие как

  • Дублирование первичного ключа
  • Уникальное ключевое условие
  • Условие раздела

Ответ 5

Я использую bash для командной строки, чтобы найти дублируемую строку в файле csv:

awk -F\, '{print $1$2}' /my/source/file.csv| sort -n| uniq -c| grep -v "^\ *1"

когда два первых столбца являются первичным ключом.

Ответ 6

В качестве дополнения к исходному вопросу, в NodeJS я хочу записать пропущенный счетчик в переменную снизу: message: Records: 460377 Deleted: 0 Skipped: 145280 Warnings: 0 Как я могу получить этот пропущенный счет (например, как у нас warningCount в MySQL NPM)