You can't specify target table 'a' for update in FROM clause——MySQL使用同一表数据更新字段

You can’t specify target table ‘a’ for update in FROM clause
这个错误你遇到过吗?

当我使用update语句更新数据表时遇到了这个错误,我的场景是将同一张表里的某行数据的某个字段,更新为和同一张表另外一行相应字段的同一值。

下面是解决过程。

一.要解决的问题

在MySQL中需要使用已经存在的一行数据的字段更新另外一行数据的字段。举个例子,假设有如下数据库表student_info:

student_info

idnameschool
1小明匡衡小学
2小红霍格沃兹魔法学院小学部
3小华李庄小学

现在需要将小明和小红的school改为和小华的一致,我们应该怎么写sql呢?

二.自然但错误的写法

UPDATE school_info
SET school = (
	SELECT
		school
	FROM
		school_info
	WHERE
		NAME = '小华'
)
WHERE
	NAME IN ('小明', '小红')

这样写会报如下错误:
You can’t specify target table ‘a’ for update in FROM clause
所以这样写是不行的。MySQL并不支持这样的写法。

三.正确的写法

UPDATE school_info AS s1,
 	school_info AS s2
SET s1.school = s2.school
WHERE
	s1. NAME IN ('小明', '小红')
AND s2. NAME = '小华'

这样就可以避免上述报错成功更新数据了。

另外,如果喜欢我的文章,可以扫码或直接搜索"Java面试锦囊"关注我的微信公众号。我会定期发布原创文章,期待你的到来
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值