Как загрузить данные с помощью дополнительных полей? - PullRequest
0 голосов
/ 21 октября 2019

Возможно ли LOAD DATA a csv в mysql без добавления пустых значений для несуществующих столбцов в конце?

Все мои дополнительные столбцы отсортированыв конце схемы:

CREATE TABLE `person` (
    id int(20) NOT NULL AUTO_INCREMENT,
    firstname varchar(30) NOT NULL,
    lastname varchar(30) NOT NULL,
    optional1 varchar DEFAULT NULL,
    optional... varchar DEFAULT NULL,
    optional50 varchar DEFAULT NULL,
    PRIMARY KEY (`id`)
) engine=innodb AUTO_INCREMENT=0;

sample.csv:

1;john;doe
2;jabe;doe;;;opt val3;;;;;;opt val9;;;;;;...

Важное замечание: Я не хочу явным образом перечислять все столбцы в моем LOAD DATA INFILE выражении sql (Я знаю, что это будет работать, используя комбинацию IFNULL и @var).

Но я не могу просто загрузить в таблицу, сказав mysql игнорировать пропущенные поля в конце каждой строки

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Документация MySQL LOAD DATA синтаксис предоставляет следующую информацию:

По умолчанию, когда в конце оператора LOAD DATA не указан список столбцов,входные строки должны содержать поле для каждого столбца таблицы. Если вы хотите загрузить только некоторые из столбцов таблицы, укажите список столбцов.

[...]

Если во входной строке слишком мало полей, столбцы таблицы для каких полей вводаотсутствуют, установлены их значения по умолчанию. Для числовых типов столбец имеет значение 0.

[...]

Значение пустого поля интерпретируется иначе, чем отсутствующее поле: для строковых типов столбец устанавливаетсяв пустую строку.

Итак, учитывая ваши примерные данные:

1;john;doe
2;jabe;doe;;;opt val3;;;;;;opt val9;;;;;;...

Для записи с идентификатором 1 все необязательные столбцы будут иметь значение NULL (т.е. их значение по умолчанию),Для id 2 необязательные строковые столбцы будут установлены в пустую строку. .

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

  • предварительная обработка ввода: используйте SET, чтобы установить NULL столбцы, содержащие пустую строку
    LOAD DATA INFILE 'file.txt' INTO TABLE t1
    SET 
        optional1 = NULLIF(optional1, ''), 
        optional2 = NULLIF(optional1, ''), 
        ...
  • установить триггер BEFORE INSERT для таблицы, который устанавливает NULL пустые значения

  • запустить обновление таблицы после заселено

    UPDATE t1 SET optional1 = NULLIF(option1, ''), optional2 = NULLIF(optional1, '')
    WHERE '' IN (optional1, optional2, ...)
0 голосов
/ 22 октября 2019

Я обнаружил, что это работает должным образом, если добавить ключевое слово IGNORE в оператор LOAD DATA:

LOAD DATA INFILE 'sample.csv' IGNORE INTO TABLE persons

Таким образом, я могу определить все свои дополнительные столбцы как DEFAULT NULL, а если значения отсутствуют, они устанавливаются на NULL во время импорта.

...