全网详细解决1093 - You can‘t specify target table ‘xxx‘ for update in FROM clause的错误

1. 复现错误


今天在工作时,接到一个新需求,就是将app_page_button表中的label_code字段修改为edit,条件如下:

  1. 只更新值为nulllabel_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. 分析错误


最近申请的文心一言刚审核通过,可以借助它来分析我的错误,如下图所示:

在这里插入图片描述

文心一言的回答,和我的本意不一致。我本想在查询结果中,更新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)
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网全栈开发实战

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值