LOAD DATAにおけるユニークキー制約

提供:MySQL Practice Wiki

移動: 案内, 検索


説明

ユニークインデックスがついたテーブルに対してLOAD DATA INFILE .... ステートメントを実行すると、レコードに重複があった場合にステートメントがそこで終了してしまう。mysql CLIを用いている場合にはChangedの項目を見ることで何行目まで処理したかを知ることが出来る(JDBCの場合はStatement. getUpdateCount()で知ることが出来る)ので、問題のレコードを挿入するか破棄するかを決めて、

mysql> LOAD DATA INFILE ... IGNORE 1000 LINES;

というように既に挿入した行をスキップさせるといいだろう。既存の行を破棄させる場合は、DELETEしてからLOAD DATAを実行すること。

ユニークインデックスの重複時に既存のデータを残すか上書きするかが決まっている場合は、

LOAD DATA INFILE "filename" IGNORE ...;

または

LOAD DATA INFILE "filename" REPLACE ...;

という具合にIGNOREまたはREPLACEをつけることで、処理を中断させることなく継続することが出来る。ただし、双方どの行がスキップor上書きされたのかは分からない。SHOW WARNINGSコマンドにも警告が残っていないからである。どの行で重複が起きたのかを知るためには、LOAD DATA ... IGNORE ... LINESを利用して自前でロジックを書くしかない。

個人用ツール