先上个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多全部更新成功,但是这玩意性能很低,出错了不好排查
生产环境还是使用单条主键查询更新