MySQL can't specify target table for update in FROM clause

2020/09/01

在开发过程经常遇到更新mysql表的情景,例如根据id更新用户的状态。比如我们需要更新id小于100的用户的状态,假设你的sql如下:

update Users set valid = 0
where id in (
  select id from Users where id < 100
);

那么当你信心满满的去执行时候,却会发现执行结果如下: #1093 - You can't specify target table 'Users' for update in FROM clause

为何会出现这样情况那?其实是因为MySQL中不允许更新在内部select语句中使用的表,如下:

update myTable
   set  myTable.A = 
(
select  B from myTable
join...
)

许多其他数据库引擎都支持此功能,但MySQL没有,因此我们需要解决该限制。

那么在mysql中我们如何解决这个问题那?其实可以使用子查询生成临时来解决,文初的sql可以修改为下面:

update Users set valid = 0
where id in (
  select id from  (
    select id from Users where id < 100
  ) as t
);

如上sql该查询中的别名t很重要,它告诉MySQL从该选择查询中创建一个临时表t,并把它用作更新语句的条件。


微信扫描二维码,关注获取第一手技术分享

(转载本站文章请注明作者和出处 加多-技术原始积累

Show Disqus Comments

Post Directory

扫码关注公众号:加多
发送 290992
即可立即永久解锁本站全部文章