2011年9月14日水曜日

【MySQL】複数のupdate

久しぶりの投稿です。
しかも久しぶりの技術ネタです。

最近仕事でSQL文を書いていて、いろんな条件でupdate文を実行する必要が出てきました。

update文は、同じ形式のデータなら複数まとめて実行できるのですが、
この条件の時は◯○を更新して、この条件の時は☓☓を更新して。。。

というのが難しいです。(簡単にできるよというのがあれば教えて下さい。)

で、どうしたかというと、insert文を使います。

insert ~ on duplicate key update

この構文は、insertを実行して、uniqueかprimary keyに一致するものがすでに登録済みの場合に該当行を更新することが出来ます。



insert into hoge (id, num) values(1, 10), (2, 20), (3, 30) on duplicate key update num = num + values(num);

idがprimary keyとします。
このときidが一致するものがすでに登録済みの場合は登録してあるnumにinsert使用とした値(values(num))を加算して更新しています。

ここまでは、普通のon duplicate key update構文です。
これにいろんな条件をつけるわけですが、たとえば、

テーブルに登録されている値と指定した値が同じ時は更新しないで、変更があった場合に更新する

ということをしようとするには



insert into hoge (id, num) values (1, 10), (2, 20), (3, 30) on duplicate key update num = if(num <> values(num), num, values(num));

というSQLを実行すればできます。

on duplicate key updateにはif文が使えるわけです。

これをうまく使えば複雑なupdate文も一回で済みます。
複数のカラムを更新するとき、引数に更新したいカラムが入ったり入らなかったりする場合は



insert into hoge (id, num1, num2) values (1, num1のデフォルト値, 10), (2, 20, 20) on duplicate key update num = if(values(num1) = num1のデフォルト値, num1, values(num1))


みたいに更新しないカラムにデフォルト値を指定しておけば実現できます。

あくまでレコードがあるときに更新するので、ないときのことも想定しておきましょう。

また何かあれば書いていきます。

0 件のコメント:

コメントを投稿