MySQL

2015-08-21, mysql

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

この記事は役に立ちましたか?