2016.11.14
2020.1.7

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' 

参考リンク

MySQL】関連記事