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になるのは、わからんかった…な。