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を利用して自前でロジックを書くしかない。