INSERT ON DUPLICATE KEY UPDATE か INSERT IGNORE
MySQLにはMERGEクエリがないおかげで、ちょくちょく議論になります。あるキーを持つデータが存在すれば、更新をかけて、存在しない場合には追加するというケースですね。
以下のコードで解決、と思いきや、実はもう一つ落とし穴があります。MySQLは、UPDATEのWHERE句にマッチした行数ではなくて、実際に値が変更された行数を「affected rows」として返してきます。つまり、該当するキーは存在するものの、更新される値が全て同値であった場合に戻り値(rows)が「0」になってしまいます。
int rows = stat.executeUpdate("UPDATE ... ");
if (rows == 0){
stat.executeUpdate("INSERT INTO ...");
}
参考リンクにもあるように、あくまで、正攻法はINSERT ON DUPLICATE KEY UPDATEですが、とりあえず以下のようにINSERT IGNOREで回避することもできます。
int rows = stat.executeUpdate("UPDATE ... ");
if (rows == 0){
stat.executeUpdate("INSERT IGNORE INTO ...");
}
キー重複があった場合にエラーを抑制するので処理が正常に進みます。しかし、キー重複以外の(例えばNULL禁止列にNULLを代入しようとしたりした場合の)エラーもまとめて無視されてしまうという副作用があるので、利用は慎重に行う必要があります。
参考URL
この記事は役に立ちましたか?
- EnglishWorm.com
- SinglesFan.com
- LmLab.net
- サイトマップ
- 運営者について