【MySQL异常】MySQL出现 You can‘t specify target table for update in FROM clause 错误的解决方法

本文讲述了在MySQL5.7.37中遇到YoucantspecifytargettableforupdateinFROMclause错误的背景、原因、解决方案,以及在使用子查询时应注意为虚拟表添加别名以确保数据安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL出现 You can‘t specify target table for update in FROM clause 错误的解决方法

一、背景描述

MySQL 数据库,版本号为 5.7.37(语句为 SELECT VERSION();)

在 mysql 数据库中有一张表为 device_data_monitor,需求是更改这个表中的某一列的值。于是就使用以下语句更新 pillar_id 这一列的值。

UPDATE device_data_monitor 
SET pillar_id = 29 
WHERE
	monitor_id IN ( SELECT monitor_id FROM device_data_monitor WHERE pillar_id = 10 );

结果就会报错,内容如下:

You can‘t specify target table for update in FROM clause 结果如下:

在这里插入图片描述

二、原因分析

在MySQL中,可能会遇到 You can’t specify target table ‘表名’ for update in FROM clause 这样的错误

它的意思是说,不能在同一语句中,先 select出同一表中的某些值,再 update这个表,即不能依据某字段值做判断再来更新某字段的值。

这个问题在MySQL官网中有提到解决方案:MySQL-UPDATE- 拉到文档下面

You can’t specify target table ‘表名’ for update in FROM clause 这样的错误的原因就是因为MySQL不支持在子查询中引用更新目标表。

我们要更新的就是 device_data_monitor 这张表,而在子查询的 FROM 语句中还从这张表查询出数据,这在MySQL中是不被允许的。之所以有这个规定,也是考虑到了数据安全。

三、解决方案

解决方法: select的结果再通过一个中间表 select多一次,就可以避免这个错误。

UPDATE device_data_monitor 
SET pillar_id = 29 
WHERE
	monitor_id IN ( SELECT monitor_id FROM (SELECT monitor_id FROM device_data_monitor WHERE pillar_id = 10) a );

四、踩过的坑

最里面的 SELECT 语句查询出来的结果当作虚拟表,注意:此虚拟表一定要有别名,否则就会报另外的错误,如下图所示:

在这里插入图片描述

出现此错误的解决方案就是 子查询语句中的 虚拟表 添加别名。 比如解决方案中的 SQL语句里有个 别名为 a 。

本文完结!

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

No8g攻城狮

向每一个努力改变现状的你致敬!

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

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

打赏作者

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

抵扣说明:

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

余额充值