Значение по умолчанию для пустых целочисленных полей при импорте данных CSV в MySQL

я импортирую CSV в таблицу MySQL с LOAD DATA INFILE. В одном из полей таблицы хранятся данные почтового индекса, которые я определил в структуре таблицы contributor_zipcode INT.

в CSV это поле иногда пустое. Когда я выполняю LOAD запрос, MySQL выдаст предупреждение, как:

Incorrect integer value: '' for column 'contributor_zipcode' at row 180

Я попытался переопределить поле как contributor_zipcode INT DEFAULT '0', который создает то же самое предупреждение, и contributor_zipcode INT DEFAULT NULL, который MySQL не позволит. Есть советы?

3 ответов


пустые значения интерпретируются как пустая строка ( " ), а не NULL, поэтому значение по умолчанию не используется.

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

вы можете использовать это, чтобы установить значение на все, что вы хотите (NULL, 0 и т. д.).

вот пример, предполагая, что вы хотите установить его 0:

LOAD DATA INFILE '...'
INTO TABLE your_table
FIELDS TERMINATED BY ','
(column_one,..., @contributor_zipcode,..., column_n)
SET contributor_zipcode = IF(@contributor_zipcode='',0,@contributor_zipcode);

в Csv Я заменил все "" на "\N " перед запуском скрипта, это создает нулевое поле в db


для некоторых элементов (например, почтовые индексы), может быть лучше для значения по умолчанию, чтобы быть null, а не 0.

Предположим у вас есть таблица под названием (Что еще) People.

create table People (
    id int,
    first_name varchar(30),
    last_name varchar(50),
    city varchar(50),
    state varchar(50),
    zip int
);

далее загрузить file.csv на People таблица. обратите внимание на последнюю строку (начиная с set), где zip назначен null если значение в файле "" (он же пустая строка)

load data local infile '/path/to/file.csv'
into table People
fields 
    terminated by ','
    enclosed by '"'
lines terminated by '\n'
(id, first_name, last_name, city, state, @zip)
set zip = if(@zip='', null, @zip);