文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

MySQLのLOAD DATAの罠:その1

MySQLのLOAD DATAって挙動に癖があるので、色々試しておいた方がいいですよ〜


f:id:treeapps:20180418131549p:plain

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ブログ