Извините за мой английский..
Я написал 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 неверен.
Что мне нужно сделать?
Спасибо!
Строка типа "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, и либо исправить плохие данные, либо распечатать ошибку и выйти.
FILELS
"FIELDS
" как "FILELS
".