mysql嵌套查询更新

先上个mysql报错

sql语句

UPDATE t_stub_group SET FRANCHISE = 1 WHERE ID IN (SELECT ID FROM t_stub_group WHERE MODIFY_TIME < '2023-02-08 04:05:12')

报错信息

1093 - You can't specify target table 't_stub_group' for update in FROM clause

错误原因:

在更新和嵌套的子查询中操作的同一张表

解决方法

将子查询结果再封装一次,AS生成新的临时表再查询操作一次
UPDATE t_stub_group SET FRANCHISE = 1 WHERE ID IN ( SELECT tmp.ID from ( SELECT ID FROM t_stub_group WHERE MODIFY_TIME < '2023-02-08 04:05:12' )AS tmp );

总结

在数据库中使用update set in(子句)时,子句查询结果不宜超过200条;
虽然在实际操作中子句查了3w多条数据花费1s多全部更新成功,但是这玩意性能很低,出错了不好排查
生产环境还是使用单条主键查询更新

posted @ 2023-02-08 15:02  小万2333  阅读(219)  评论(0)    收藏  举报