2012年6月21日木曜日

[mysql]load data infile

mysql の load data infile でハマった。
ハマる前から
http://d.hatena.ne.jp/treeapps/20110409/1302332142
な記事は見つけててわかってたのに…。

ハマったのはキー重複なデータを読み込んだ時にエラーになってほしいのに ignore されてしまう。
エラーになってほしいんだ。。。

で、上の記事で引用されているのは mysql4.1 のドキュメントで mysql5.1 じゃなかった。

そしてmysql5.1の日本語翻訳ドキュメントでは下記のように記述されていた。(2012-06-21現在)


http://dev.mysql.com/doc/refman/5.1/ja/load-data.html
もし IGNORE を指定すると、 固有キー値上の、既存行を複製するインプット行はスキップされます。もしどちらのオプションも指定しなければ、その動作は LOCAL キーワードが指定されたかどうかによって決まります。LOCAL を利用すると、複製キー値が見つかった時点でエラーが発生し、テキスト ファイルの残りは無視されます。LOCAL を使用しなければ、デフォルトの動作は IGNORE が指定された時と同じです。これは、サーバは操作の最中にファイルの送信を中止する事ができないからです。

でも、英語ドキュメントでは次のように。

http://dev.mysql.com/doc/refman/5.1/en/load-data.html
If you specify IGNORE, input rows that duplicate an existing row on a unique key value are skipped. If you do not specify either option, the behavior depends on whether the LOCAL keyword is specified. Without LOCAL, an error occurs when a duplicate key value is found, and the rest of the text file is ignored. With LOCAL, the default behavior is the same as if IGNORE is specified; this is because the server has no way to stop transmission of the file in the middle of the operation.
動作は英語ドキュメントと同じ(上のリンク先記事で記述されている内容)どおり、
LOCAL を指定しなければ キー重複でエラーにするよ、
LOCAL を指定すれば IGNORE にするよ、
ってことでした。


つまり LOCAL を指定すると REPLACE or IGNORE のいづれかになるということでした。


あー。

0 件のコメント:

コメントを投稿