想象一下以下sql查询:
UPDATE MYTABLE
SET COL2 = (SELECT COL2 + 1 FROM (SELECT MAX(COL2) FROM MYTABLE) AS X)
WHERE ID IN (1,2,3,4,5)
假设在执行更新之前MAX(COL2)为1.
我的意图是,对于ID = 1的更新,COL2更新为’max(COL2)1′(即2),并且重新评估后续更新’MAX(COL2)1′,以便ID = 2 ,COL2 = 3,ID = 3,COL2 = 4等……
实际发生的是,对于所有行(ID = 1,2,3,4,5),COL2的值为2.
是否有一种聪明的方法可以在每次更新时重新评估MAX(COL2)1的值?我意识到这样做可能存在性能问题,但我很好奇!有没有更好的替代方案(不涉及多个更新语句)?
解决方法:
UPDATE mytable, (
SELECT @loop := MAX(col1)
FROM
mytable
) o
SET col1 = (@loop := @loop + 1)
你在这里遇到的是查询稳定性.
没有查询可以看到自己做出的更改,或以下查询:
UPDATE mytable
SET col1 = col2 + 1
WHERE col1 > col2
永远不会结束
标签:mysql,sql,sql-update
来源: https://codeday.me/bug/20190716/1473565.html