MySQLのLOAD DATAって挙動に癖があるので、色々試しておいた方がいいですよ〜
LOAD DATAは高速で非常に使い勝手がよいのですが、いくつか注意する点があります。
今回はLOAD DATAってちゃんとエラーを返してくれるの?という件について確認してみます。
テストデータ:t_test.csv
読み込むファイルはわざとDuplicate Key Errorが出るようにしておき、後述でこれをシェルスクリプトから実行してみます。
$ cat t_test.csv 1 1 1
LOAD DATA用SQL:loadData.sql
$ cat loadData.sql load data local infile 't_test.csv' into table t_test fields terminated by ',' enclosed by '' lines terminated by '\n';
LOAD DATA実行用sh:loadData.sh
$ cat ./loadData.sh #!/bin/sh mysql -uroot test < loadData.sql if [ $? -eq 1 ]; then echo "error" else echo "success" fi
loadData.shを実行してみます。さて・・・
実行結果
$ ./loadData.sh success
え!?successって???
どうやらDuplicate Key Errorはエラーとして扱われない模様・・・
これ、errorコード返るんでしょうか?loadData.sqlをわざとSyntaxErrorを起こしてみます。
シンタックスエラーがあるloadData.sqlに修正
$ cat ./loadData.sql load data local infile 't_test.csv' into table t_test fields terminated by ',' enclosed by '' lines terminated by '\n'; orz
よし、今度こそ・・・
実行結果
$ ./loadData.sh ERROR 1064 (42000) at line 2: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'orz' at line 1 error
ふむ。SyntaxErrorは問題ないようです。想定通りエラー拾えました。
結局Duplicate Entryのエラーは、csvの行数とinsert後のレコード数を比較するしかないのかなあ。
↓この記事でこれらの動作について解ったので、合わせてどうぞ!
MySQLのLOAD DATAの罠:その1 - 文系プログラマによるTIPSブログ
MySQLのLOAD DATAの罠:その2 - 文系プログラマによるTIPSブログ
MySQLのLOAD DATAの罠:その3 - 文系プログラマによるTIPSブログ