Загрузить данные в файл - Загрузить CSV-файл

0

Извините за мой английский..

Я написал shell-скрипт для обновления таблицы в локальной базе данных mysql с помощью csv файла.

#! /bin/sh
mysql --user=root --password=12345 \
-e "USE database one;" \
-e "CREATE TABLE IF NOT EXISTS xxxx LIKE xxx;" \
-e "TRUNCATE TABLE xxxx;" \
-e "LOAD DATA INFILE \"/var/lib/mysql-files/data.csv\" INTO TABLE xxxx FIELDS TERMINATED BY ';' ;" \

CSV файл:

1;Müller;Max
2;Wayne;Roney

Поле в моей базе данных "id" является целым и первичным. Если я изменю csv, это поле, как

a;Müller;Max 
2;Wayne;Roney

данные загрузки скрипта в csv в таблице. Я хотел бы иметь ошибку, потому что csv неверен.

Что мне нужно сделать?

Спасибо!

  • 0
    Вы неправильно FILELS " FIELDS " как " FILELS ".
  • 0
    О верно. Но у меня та же ошибка. : /
Теги:
sh
import-csv

1 ответ

1

Строка типа "a" автоматически преобразуется в числовое значение, если вы попытаетесь вставить ее в целочисленный столбец. Числовое значение "a" равно 0, поскольку оно не имеет ведущих цифр.

Я нашел способ заставить ошибку в этом случае.

Во-первых, вы не должны использовать AUTO_INCREMENT для столбца id. Это позволит 0, потому что это вызывает создание нового идентификатора.

Во-вторых, перед загрузкой данных необходимо предварительно вставить строку со значением 0 для первичного ключа. Тогда, если значение типа 'a' преобразуется в 0, это приведет к нарушению UNIQUE KEY.

mysql --user=root --password=12345 \
-e "USE database one;" \
-e "CREATE TABLE IF NOT EXISTS xxxx LIKE xxx;" \
-e "TRUNCATE TABLE xxxx;" \
-e "INSERT INTO xxxx (id) VALUES (0);" \
-e "LOAD DATA INFILE \"/var/lib/mysql-files/data.csv\" INTO TABLE xxxx FIELDS TERMINATED BY ';' ;" \
-e "DELETE FROM xxxx WHERE id = 0;"

Обратите внимание, что это не работает, если вы используете LOAD DATA LOCAL INFILE...

https://dev.mysql.com/doc/refman/5.7/en/load-data.html

Без LOCAL возникает ошибка, когда обнаружено дублирующее значение ключа, а остальная часть текстового файла игнорируется. С LOCAL поведение по умолчанию такое же, как если указано IGNORE; это связано с тем, что сервер не имеет возможности остановить передачу файла в середине операции.

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

  • 0
    Спасибо! Я сделал вашу помощь сейчас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню