我正试图通过将行标记为已更新来转换查询幂等项。但是,查询规范的一部分是返回与筛选器匹配的行is。我想做的事情如下:
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我希望避免de dupe步骤使用UNION而不是UNION ALL,所以我想知道操作符的语义是否保证第一个查询不会看到第二个查询的结果。
相关Qs
发布于 2019-12-07 13:57:05
PostgreSQL WITH 文档指定两个CTE将在相同的快照中并发执行,因此使用UNION ALL是安全的。
WITH中的子语句是与其他并发执行的,与主查询并行执行。因此,当使用WITH的数据修改语句时,指定的更新实际发生的顺序是不可预测的。所有语句都是用相同的快照执行的(参见第13章),因此它们不能“看到”对方对目标表的影响。这减轻了行更新的实际顺序的不可预测性的影响,并意味着返回数据是在不同的子语句和主查询之间通信更改的唯一方法。
https://stackoverflow.com/questions/59226724
复制相似问题