ネットワーク全体でエラー 1093 を解決 - FROM 句で更新対象のテーブル 'xxx' を指定できません 詳細

1. エラーを再現する


app_page_button今日仕事をしていたときに、テーブルのlabel_codeフィールドをedit次の条件に変更するという新しい要求を受け取りました。

  1. null値のみを更新しますlabel_code

  2. /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)

おすすめ

転載: blog.csdn.net/lvoelife/article/details/130225971