My Sql Bulk вставляет загрузку данных с усечением - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь загрузить данные из файла 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';

В приведенном выше синтаксисе таблицы я указал длину данных столбца "title", равную "10".Но значение в файле данных для второй строки превышает длину 10.

Когда я выполнил SQL-запрос, данные успешно загружаются в базу данных MySQL, и вот следующие выходные данные & Мои значения во второй строке усекаются дляполе "заголовок".Не могли бы вы предложить, как прекратить загрузку строки без усечения.Кроме того, он должен загрузить следующую последовательную строку без завершения, если данные соответствуют.Пожалуйста, предложите

Вывод базы данных:

'475', 'Back', '2014-04-01', 'FFFF'
'476', 'bbbbbbbbbb', '2014-09-01', 'DDD'

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Насколько я понимаю, ниже приведены несколько моментов, которых вы хотите достичь:
1) Данные не должны быть усечены, если длина заголовка больше указанной длины поля в соответствии со структурой таблицы.
2) Если длина заголовкаболее того, эта запись должна быть пропущена при выполнении импорта записей, а остальная часть процесса должна продолжаться вперед.

Ответ в соответствии с базой данных mysql, принятой во внимание:

Вы можете использоватьsql_mode as TRADITIONAL (заставить MySQL вести себя как «традиционная» система баз данных SQL. Простое описание этого режима - «выдавать ошибку вместо предупреждения» при вставке неверного значения в столбец. Ссылка: https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html)

Теперь после установки этого режима при импорте записей будет возникать ошибка, если какие-либо неверные данные или значение вне диапазона будут вставлены в таблицу.

Следующая часть, для значений вне диапазона, их нет.чтобы пропустить строки ошибок. Вы можете проверить существующую ссылку для обсуждения: Пропустить строки ошибок, пока loaДанные в таблицу mysql из файла с разделителями

Для пропуска строк, которые нарушают уникальные ограничения или возможно создают дубликаты записей, могут быть пропущены с использованием ключевого слова IGNORE вместе с LOAD DATA INFILE.

См .: https://dev.mysql.com/doc/refman/5.5/en/load-data.html

0 голосов
/ 28 сентября 2018

Вот трюк, который вы можете использовать.Предполагая, что максимальная ширина 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 имеет возможность преобразовывать данные во время чтения, но я не уверен, что они могут их заблокировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...