見出し画像

MySQL8系 LOAD DATA LOCAL INFILEでdatetimeカラムにNULL値をセットする

ハマったのでメモしておく。

CSVファイルのデータをローカルのMySQLにインポートしたのだが、datetimeカラムのNULLが「0000-00-00 00:00:00」でインポートされてしまった。NULLはNULLでインポートしたいんだ…。

LOAD DATA LOCAL INFILE '{{csvファイルパス}}' INTO TABLE {{インポートするテーブル名}} FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 LINES;

ダサいが、「0000-00-00 00:00:00」をUPDATE文で無理やりNULLに置き換えようとしても、MySQL8系は扱いが厳密らしくIncorrect DATETIME valueのエラーが出てできなかった。

ERROR 1525 (HY000): Incorrect DATETIME value: '0000-00-00 00:00:00'

調べてLOAD DATAにSET句でNULLIF設定すればNULLでインポートできるようになった。

 SET {{カラム名}} = NULLIF({{カラム名}}, 0)

最終形のLOAD DATA文。

LOAD DATA LOCAL INFILE '{{csvファイルパス}}' INTO TABLE {{インポートするテーブル名}} FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 LINES SET {{カラム名}} = NULLIF({{カラム名}}, 0);

ちなみに、以下はMySQL8系ではエラーになるか「0000-00-00 00:00:00」でインポートされちゃいます。

SET {{カラム名}} = NULLIF({{カラム名}}, '');
SET {{カラム名}} = NULLIF({{カラム名}}, NULL);

ゼロを指定したらNULLになるのは、わからんかった…な。