💭

【MySQL】まとめてupdate処理したい

2022/08/08に公開

わりと結構な回数、同じようなupdate処理をしないといけなくなりました。
最初、ループで何度もupdate処理をさせる、というのを想像したのですが
もっとかっこよいupdate方法ないかな?
と思っていろいろ調べたらありましたので紹介します。

環境

  • MySQL 5.6

UPDATE処理

UPDATE {テーブル名} SET columnA = ELT(FIELD(columnB, 1, 2, 3, ...), A, B, C, ...) WHERE columnB IN (1, 2, 3, ...);

※この方法、EC-CUBEで実現させるためには、updateメソッドではなくSQL文をいちから作るしかないです

見慣れない関数だったので以下、リファレンス貼ります

ELT()

https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_elt

ELT() は、文字列リストの N 番目の要素を返します。
N = 1 の場合は str1、N = 2 の場合は str2 のように返します。
N が 1 よりも小さいか、引数の数よりも大きい場合は、NULL を返します。
ELT() は FIELD() の補数です。

mysql> SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo');
        -> 'ej'
mysql> SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo');
        -> 'foo'

FIELD()

https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_field

str1、str2、str3、... リスト内で str のインデックス (位置) を返します。str が見つからない場合は、0 を返します。

FIELD() へのすべての引数が文字列の場合は、すべての引数が文字列として比較されます。すべての引数が数値の場合は、数字として比較されます。それ以外の場合は、引数が倍精度として比較されます。

NULL ではどの値との等価比較にも失敗するため、str が NULL である場合は、戻り値が 0 になります。FIELD() は ELT() の補数です。

mysql> SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
        -> 2
mysql> SELECT FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');
        -> 0

参考

MySQLでバルクアップデートを実現するには

Discussion