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 用于更新/返回+选择?的主要内容,如果未能解决你的问题,请参考以下文章