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;
(笔记)