我想要查询数据的同时更新数据,所以我写了如下的语句
UPDATE `user` SET flag = 0 WHERE userId in(SELECT userId FROM USER WHERE flag = 1)
运行报错如图:
百度发现(我的参考链接:https://blog.csdn.net/h996666/article/details/81699255)
mysql5.xx版本执行以上语句没有问题,但是我的是mysql8版本所以不能执行以上语句,
因为在MYSQL里,不能先select一个表的记录,在按此条件进行更新和删除同一个表的记录,
解决办法是,将select得到的结果,再通过中间表select一遍,这样就规避了错误,
这个问题只出现于mysql,mssql和oracle不会出现此问题。
所以只要将语句做如下修改即可:
UPDATE `user` SET flag = 1 WHERE userId IN(SELECT userId FROM(SELECT userId FROM `user` WHERE flag = 0)tt)
语句拆分解析:
1,将以下查询结果作为中间表,
SELECT userId FROM `user` WHERE flag = 0
2,再查询一遍中间表作为结果集:
SELECT userId FROM(SELECT userId FROM `user` WHERE flag = 0)tt
3,执行更新数据