MySQL

MySQL

【MySQL】サブクエリを使ったUPDATEで「ERROR 1093」が出る場合の対処方法

2018/03/29

hogeテーブルのserialカラムにある文字列「-」(全角ハイフン)を、「-」(半角ハイフン)に変換したいという場合に、同じテーブルをサブクエリ内に書くと、ERROR 1093 が出るので、その対策を備忘録としてポストします。

サブクエリの FROM 句と更新のターゲットの両方に同じテーブルを書くとエラーとなる

hogeテーブルのserialカラムにある文字列「-」(全角ハイフン)を、「-」(半角ハイフン)に変換したいという場合に、以下のようなSQLを書きました。

すると以下のようなエラーが出ます。

#1093 - HY000You can't specify target table 'hoge' for update in FROM clause

ERROR:1093というらしい。
エラーの理由は以下ページ。

サブクエリーは SELECT ステートメントだけでなく、UPDATE および DELETE ステートメント内でも正当であるため、UPDATE ステートメント内の割り当てのためにサブクエリーを使用できます。ただし、サブクエリーの FROM 句と更新のターゲットの両方に同じテーブル (この場合は、テーブル t1) を使用することはできません。

要約すると、同じテーブルに対するサブクエリからのID指定などの操作は出来ないようです。

回避すべく調査したところ、サブクエリ内を別名にして受け取れば良いとのこと。
言葉にするとよく分かりませんでしたが、以下のようなSQLにすると通るようです。

分かったような、分からないような…。
とりあえず、備忘録にしておくべし。

関連する投稿

【MySQL】「REPLACE」で文字列を一括で置換する方法

-MySQL
-, , , ,