UPDATE FROM 如何工作?

Muk*_*kul 6 postgresql

当尝试运行此查询时,我的假设是 PostgreSQL 将在 id=0 且初始 counter=0 的行上运行更新两次,最终计数器=11,但它实际上只运行一次并导致 counter=6 。

有人可以帮忙找出原因吗?我花了很多时间试图解决这个问题,但似乎无法弄清楚为什么会这样。

with duplicatedids as 
  ((select 0 as idx, 6 as v) union 
   (select 1 as idx, 5 as v))
update  verify_seq_update 
set counter = counter + duplicatedids.v 
from duplicatedids 
where verify_seq_update.id <= duplicatedids.idx ;
Run Code Online (Sandbox Code Playgroud)

ype*_*eᵀᴹ 11

AnUPDATE可以修改多行,但每行只能修改一次。

有关更详细的解释,请参阅UPDATEPostgres 文档的部分:

注意
... 使用时,FROM您应该确保连接为要修改的每一行最多生成一个输出行。换句话说,目标行不应连接到其他表中的多个行。如果是这样,则仅使用连接行之一来更新目标行,但将使用哪一行是不容易预测的。