UNION ALL vs UNION 用于更新/返回+选择?

Posted

技术标签:

【中文标题】UNION ALL vs UNION 用于更新/返回+选择?【英文标题】:UNION ALL vs UNION for Update/Returning + Select? 【发布时间】: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 来避免重复数据删除步骤,所以想知道运算符的语义是否保证第一个查询不会看到第二个查询的结果。

相关问题

使用 CTE 进行更新 + 选择:

有副作用的函数的执行顺序:Does postgres union guarantee order of execution when invoking functions with side effects?

手动重复数据删除:Update a table from a union select statement

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于UNION ALL vs UNION 用于更新/返回+选择?的主要内容,如果未能解决你的问题,请参考以下文章

UNION ALL UNION

Mysql联合查询union和union all的使用介绍

union all和union的区别

union all和union的区别

union all和union的区别

UNION和UNION ALL