記事ディレクトリ
1. エラーを再現する
app_page_button
今日仕事をしていたときに、テーブルのlabel_code
フィールドをedit
次の条件に変更するという新しい要求を受け取りました。
-
null
の値のみを更新しますlabel_code
-
で
/edit/${id}'
終わりますoption_value
次のコードに示すように、最初に次を使用してSQL
、上記の条件を満たすレコードをクエリします。
SELECT
id, label, label_code, option_value
FROM
app_page_button
WHERE
label_code IS NULL
AND option_value LIKE '%/edit/${id}';
+-----+-------+------------+-----------------------+
| id | label | label_code | option_value |
+-----+-------+------------+-----------------------+
| 706 | 编辑 | NULL | put:common/edit/${id} |
| 710 | 编辑 | NULL | put:common/edit/${id} |
| 714 | 编辑 | NULL | put:common/edit/${id} |
+-----+-------+------------+-----------------------+
上記の条件を満たすレコードを取得し3条
、次のSQL
ステートメントを使用して変更します。
UPDATE app_page_button
SET label_code = 'edit'
WHERE
id IN (
SELECT
id
FROM
app_page_button
WHERE
label_code IS NULL AND option_value LIKE '%/edit/${id}'
);
ERROR 1093 (HY000): You can't specify target table 'app_page_button' for update in FROM clause
つまり、You can't specify target table 'app_page_button' for update in FROM clause
エラーです。
2. 分析エラー
最近適用された Wenxin Yiyan が承認されたので、次の図に示すように、それを使用して間違いを分析できます。
Wen Xin の一言の答えは、私の当初の意図と矛盾しています。クエリ結果の値を更新したかったのですlabel_code
。
したがって、このエラーを解決するには、自分で分析する必要があります。
You can't specify target table 'app_page_button' for update in FROM clause
意味:app_page_button
同一テーブル ( ) でクエリできないデータが、app_page_button
同一テーブル ( ) の更新データとして使用されています。
3.バグを修正
select
同じテーブル内のいくつかの値は最初に取得できないため、 update
(同じステートメント内で) 最初にこのテーブルを取得し、次にクエリ結果を一時テーブルに格納し ( tmp
)、id
この一時テーブルから取得します ( tmp
)。次のコード:
UPDATE app_page_button
SET label_code = 'edit'
WHERE
id IN (
SELECT id
FROM (
SELECT
id
FROM
app_page_button
WHERE
label_code IS NULL AND option_value LIKE '%/edit/${id}'
) as tmp
);
Query OK, 3 rows affected (0.01 sec)
Rows matched: 3 Changed: 3 Warnings: 0
この文によるとQuery OK, 3 rows affected (0.01 sec)
、次の SQL からわかるように、更新が成功したことがわかります。
select
id, label, label_code, option_value
from
app_page_button
where
id in (706,710,714);
+-----+-------+------------+-----------------------+
| id | label | label_code | option_value |
+-----+-------+------------+-----------------------+
| 706 | 编辑 | edit | put:common/edit/${id} |
| 710 | 编辑 | edit | put:common/edit/${id} |
| 714 | 编辑 | edit | put:common/edit/${id} |
+-----+-------+------------+-----------------------+
3 rows in set (0.00 sec)