Как загрузить DATA, установив значение по умолчанию NULL, если поле столбца пустое? - PullRequest
0 голосов
/ 16 октября 2019

Как можно установить отсутствующие значения поля CSV в sql NULL во время LOAD DATA? Проблема в следующем примере состоит в том, что mysql не позволяет мне импортировать файл, если поле dob предлагает только пустое поле:

create table persons (
    id bigint(20) NOT NULL AUTO_INCREMENT,
    dob date DEFAULT NULL,
    lastname varchar(20) NOT NULL,
    //in real world having 100 columns!
    PRIMARY KEY (id)
);

import.csv с отсутствующим днем ​​рождения:

1;;doe
2;;dane
...

Импорт миллионов строк:

LOAD DATA INFILE 'import.csv' INTO TABLE persons FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n';

Я, конечно, мог бы использовать:

 (@col1, @col2... @col100) 
        SET date = nullif(@col2,''),
            lastfield = nullif(@col100,'')
        ;

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

Или я мог бы как-то только определить поля non-char и использовать nullif для них?

(@col2)
   SET date = nullif(@col2,'');

И оставить все как есть?

1 Ответ

0 голосов
/ 16 октября 2019

Из справочного руководства MySQL 8.0

Обработка значений NULL варьируется в зависимости от используемых параметров FIELDS и LINES:

  • Для значений FIELDS и LINES по умолчанию NULL записывается как значение поля \ N для вывода, а значение поля \ N читается как NULL для ввода (при условии, что символ ESCAPED BY равен \).

  • Если FIELDS ENCLOSED BY не пусто, поле, содержащее буквенное слово NULL в качестве значения, читается как значение NULL. Это отличается от слова NULL, заключенного в FIELDS ENCLOSED BY символов, которое читается как строка 'NULL'.

  • Если FIELDS ESCAPED BY пусто, NULL записывается как слово NULL.

  • В формате с фиксированной строкой (который используется, когда FIELDS TERMINATED BY и FIELDS ENCLOSED BY оба пусты), NULL записывается как пустая строка. Это приводит к тому, что и значения NULL, и пустые строки в таблице становятся неразличимыми при записи в файл, поскольку оба они записываются как пустые строки. Если вам нужно уметь различать эти две части при чтении файла обратно, вам не следует использовать формат с фиксированной строкой.

Так что если вы не хотитенаписать функции nullif для столбцов, допускающих значение NULL, и, но у вас есть некоторый контроль над способом создания файла, вы можете настроить его на один из параметров, чтобы различать NULL и пустую строку или слово «NULL».

Таким образом, наличие вашего файла, например

1;\N;doe
2;\N;dane

или

"1";NULL;"doe"
"2";NULL;"dane"

И использование правильных опций FIELDS и LINES сделало бы все возможное.

...