数据库工作笔记018---MySQL 中 You can't specify target table '表名' for update in FROM clause错误解决办法

技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152  

1.在MySQL中,写SQL语句的时候 ,可能会遇到You can't specify target table '表名' for update in FROM clause这样的错误,它的意思是说,不能先select出同一表中的某些值,再update这个表(在同一语句中),即不能依据某字段值做判断再来更新某字段的值。

下面的语句会报这个错:
 

DELETE
FROM
	sys_roleaccess
WHERE
	access_id IN (
	
				SELECT
					t.access_id
				FROM
					sys_roleaccess t
				WHERE
					t.access_id NOT IN (
						SELECT
							a.access_id
						FROM
							sys_access a
					)
	)

2、问题解决

将SELECT出的结果再通过中间表SELECT一遍,这样就规避了错误。

改成下面这样:可以看到又添加了一层,也就是相当于,临时建一个视图

DELETE
FROM
	sys_roleaccess
WHERE
	access_id IN (
		SELECT
			access_id
		FROM
			(
				SELECT
					t.access_id
				FROM
					sys_roleaccess t
				WHERE
					t.access_id NOT IN (
						SELECT
							a.access_id
						FROM
							sys_access a
					)
			) t1
	)

3.注意:

需要注意的是,这个问题只出现于MySQL,MSSQL和Oracle不会出现此问题。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

添柴程序猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值