mysql不允许在同一个表上查询和更新

mysql不允许在同一个表上查询和更新,例如下面sql语句尝试将两个表中相似行的数量记录到字段cnt中。

update tb1 as outer_tb1 
   set cnt = (
      select count(*) from tb1 as inner_tb1
      where inner_tb1.type = outer_tb1.type
  );  

可以通过使用生成表的形式绕开上面的限制,mysql只会吧这个表当做一个临时表,实际上是执行了两个查询,一个是子查询的select,另一个是多表关联的update,只是关联的表是个临时表。子查询会在update语句打开表之前就完成,所以可以改为下面的方式实现:

update tb1
  inner join(
    select type,count(*) as cnt
    from tb1
    group by type
  ) as der using(type)
set tb1.cnt = der.cnt;

(笔记)

推荐阅读更多精彩内容