MySQLのUPDATEで他のテーブルをJOINする方法
MySQLでUPDATEする際に特定のレコードを更新したくてサブクエリを使ったら、まったく処理が終了しませんでした。
調べてみたら、MySQLのUPDATEでサブクエリを使ったらインデックスが適用されないらしく、特定のレコードを更新したいならJOINしないといけないようです。
目次
- UPDATE-JOIN
- DELETE-JOIN
- 参考リンク
UPDATE-JOIN
JOINするだけなら簡単と思っていましたが、MySQLだと書き方が違って小一時間ほどハマってしましました。以前もトランザクションの分離レベルでハマったことがあるので、正直、いまのところはMySQLに対してあまりいいイメージをもっていません。
そんな愚痴はとりあえず置いておいて、JOINの構文については以下の通りになります。
UPDATE aaa
LEFT JOIN bbb ON
aaa.id = bbb.id
SET
aaa.name = 'テスト'
WHERE
bbb.type = '1'
上記はテーブル「aaa」にテーブル「bbb」を外部結合して、bbb.type = '1'のレコードの「name」を”テスト”に更新しています。
パッと見は通常のSQLと何ら変わりがなくて私もすぐにはわからなかったのですが、SQLServerと比べて何気にJOINとSETの位置が逆なんですよね。SQLServerでの作業が多かったので、書き方はそっちの方が慣れています。UPDATEの構文とか他のDBもそこまで変わらないだろうと思っていたので、こんなところで躓くとは思ってもいませんでした。
こういうことがあるとO/Rマッパーって大事だなぁって思います。
DELETE-JOIN
ついでにDELETE時のJOINは以下の通り。
DELETE aaa FROM aaa
LEFT JOIN bbb ON
aaa.id = bbb.id
WHERE
bbb.type = '1'