PostgreSql - > CTE + UPDATE + DELETE - >不是预期的结果,为什么?

Ole*_*nov 10 postgresql common-table-expression

只是感兴趣,为什么下面(简化)的例子以这种方式工作.

CREATE TABLE test (id SERIAL, val INT NOT NULL, PRIMARY KEY(id));
INSERT INTO test (val) VALUES (1);

WITH t AS ( UPDATE test SET val = 1 RETURNING id ) 
DELETE FROM test WHERE id IN ( SELECT id FROM t);
Run Code Online (Sandbox Code Playgroud)

结果:
DELETE 0

问题:
为什么DELETE没有找到要删除的行?

PostgreSql版本9.2.1
事务隔离=读取提交

谢谢!

Sco*_*t S 13

我怀疑它与文档中的这一行有关-

主查询和WITH查询都是(在概念上)同时执行的.这意味着除了通过读取其RETURNING输出之外,不能从查询的其他部分看到WITH中的数据修改语句的效果.如果两个此类数据修改语句尝试修改同一行,则结果未指定.

虽然我认为ID可用,因为它在WITH子查询中没有变化,但可能会出现行可见性."未指定"一词非常含糊,这可能是postgres列表中的一个问题,因此其中一位大师可以对它进行破解......

编辑:为了提供略多的信息,我也试过更换DELETESELECT *,这返回预期行.我的直接反应是,如果它能找到返回它们的行,它应该能够找到它们来删除它们.但是如果我考虑更多,这个测试支持引用,因为数据修改语句与非数据修改语句配对产生预期结果,而两个数据修改语句产生意外结果.