【问题标题】:UNION ALL vs UNION for Update/Returning + Select?UNION ALL vs UNION 用于更新/返回+选择?
【发布时间】:2019-12-07 13:57:05
【问题描述】:

我试图通过将行标记为已更新来使查询具有幂等性。但是,查询规范的一部分是返回与过滤器匹配的行的 ID。我正在考虑执行以下操作:

WITH
prev as (
     SELECT id
       FROM books
      WHERE id = any($1::uuid[])
        AND updated
),
updated as (
     UPDATE books
        SET author = $2 || author, updated = true
      WHERE id = any($1::uuid[])
        AND not updated
  RETURNING id
)
SELECT id FROM prev
UNION ALL
SELECT id FROM updated

我希望避免使用UNION 而不是UNION ALL 来避免重复数据删除步骤,所以想知道运算符的语义是否保证第一个查询不会看到第二个查询的结果。

相关问题

【问题讨论】:

    标签: postgresql sql-update union-all


    【解决方案1】:

    PostgreSQL WITH docs 指定两个 CTE 将在同一个快照中同时执行,因此 UNION ALL 可以安全使用。

    WITH 中的子语句彼此同时执行,并与主查询一起执行。因此,当在 WITH 中使用数据修改语句时,指定更新实际发生的顺序是不可预测的。所有的语句都使用同一个快照执行(参见第 13 章),因此它们无法“看到”彼此对目标表的影响。这减轻了行更新的实际顺序的不可预测性的影响,并且意味着返回数据是在不同的 WITH 子语句和主查询之间传达更改的唯一方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多