【问题标题】:Unexpected result for two updates in the same query同一查询中两次更新的意外结果
【发布时间】:2019-11-26 08:09:09
【问题描述】:
    with
    u1 as (
        update todel set val=val+1 where id='key' returning *
    ),
    u2 as (
        update todel set val=val+2 where id='key' returning *
    )
    select * from u1
    union all
    select * from u2
    ;

预期的结果是两行,但我得到了一个,

     id  | val
    -----+-----
     key |  11

为什么会这样,我错过了什么?服务器是 pg 9.6.6

【问题讨论】:

  • 是的,union all 不会删除重复项。
  • 您正在 id = key in 2 CTE 中进行更新,但更新将发生在单行上。我认为它不会保持为 2 行 @Сухой27
  • 这可能与第二个 CTE 没有看到第一个 CTE 所做的更改有关。
  • 另外,看起来第二个 CTE 返回空集,这是出乎意料的(对我来说)。
  • 我需要一些明确的事务隔离级别吗?

标签: sql postgresql sql-update common-table-expression


【解决方案1】:

the documentation:

WITH 中的子语句彼此同时执行,并与主查询同时执行。因此,当在 WITH 中使用数据修改语句时,指定更新实际发生的顺序是不可预测的。

结果就像只执行了其中一个。

【讨论】:

  • 是的,第二个被跳过/忽略,但该部分看起来没有被 pg 记录。所以结果应该是两行,它们是同一快照上更新的结果。
  • 我同意,他们应该写清楚其中一个查询可能会被忽略。
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 2019-05-04
相关资源
最近更新 更多