My Sql Bulk вставляет загрузку данных с усечением
Я пытаюсь загрузить данные из файла CSV в базу данных MYSql через опцию массовой вставки. Ниже приведен синтаксис таблицы создания и файл CSV
CREATE TABLE discounts (
id INT NOT NULL ,
title VARCHAR(10) NOT NULL,
expired_date DATE NOT NULL,
amount VARCHAR(255 ) NOT NULL
);
Формат файла CSV:
"475","Back","20140401","FFFF"
"476","bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","20140901","DDD"
SQL-запрос:
LOAD DATA INFILE 'C:\Users\karthick\Desktop\data.csv'
INTO TABLE discounts
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n';
В приведенном выше синтаксисе создания таблицы я указал длину данных столбца "заголовок" до "10". Но значение в файле данных для второй строки превышает длину 10.
Когда я выполнил запрос SQL, данные были успешно загружены в базу данных MySQL, и вот следующие выходные данные, и мои значения во второй строке усекаются для поля "заголовок". Не могли бы вы предложить, как прекратить загрузку строки без усечения. Кроме того, он должен загрузить следующую последовательную строку без завершения, если данные соответствуют. Пожалуйста, предложите
Вывод базы данных:
'475', 'Back', '2014-04-01', 'FFFF'
'476', 'bbbbbbbbbb', '2014-09-01', 'DDD'
2 ответа
Насколько я понимаю, ниже несколько моментов, которые вы хотите достичь:
1) Данные не должны быть усечены, если длина заголовка больше указанной длины поля в соответствии со структурой таблицы.
2) Если длина заголовка больше, то эта запись должна быть пропущена при выполнении импорта записей, а остальная часть процесса должна продолжаться.
Ответ согласно базе данных mysql, принятой во внимание:
Вы можете использовать sql_mode как TRADITIONAL (заставить MySQL вести себя как "традиционная" система баз данных SQL. Простое описание этого режима - "выдавать ошибку вместо предупреждения" при вставке неверного значения в столбец. Ссылка: https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html)
Теперь после настройки этого режима при импорте записей будет возникать ошибка, если какие-либо неверные данные или значение вне диапазона будут вставлены в таблицу.
Следующая часть, для значений вне диапазона их нельзя пропустить строки ошибок. Вы можете проверить существующую ссылку для обсуждения: пропустить строки ошибок при загрузке данных в таблицу MySQL из файла с разделителями
Для пропуска строк, которые нарушают уникальные ограничения или возможно создают дубликаты записей, могут быть пропущены с использованием ключевого слова IGNORE вместе с LOAD DATA INFILE.
Вот трюк, который вы можете использовать. Предполагая максимальную ширину title
Вы хотите сохранить 100 символов, вы можете создать таблицу следующим образом:
CREATE TABLE discounts (
id INT NOT NULL,
title VARCHAR(101) NOT NULL, -- slightly larger than desired max width
expired_date DATE NOT NULL,
amount VARCHAR(255 ) NOT NULL
);
Затем загрузите ваши данные, как вы делали. Записи с заголовками, ширина которых превышает 100, на самом деле будут иметь ширину 101 в таблице базы данных. Затем вы можете выбрать такие записи для удаления:
DELETE
FROM discounts
WHERE LENGTH(title) > 100;
Если вы хотите, вы также можете изменить размер title
столбец шириной ровно 100:
ALTER TABLE discounts MODIFY COLUMN title VARCHAR(100);
Там может быть способ сделать это из LOAD DATA
, но в целом этот инструмент довольно прост и предназначен для слепой загрузки данных в таблицу MySQL. LOAD DATA
действительно имеет возможность преобразовывать данные во время чтения, но я не уверен, что они могут их заблокировать.