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

只是感兴趣,为什么下面(简化)示例以这种方式工作.
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);

结果:
删除0

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

Postgresql版本9.2.1
事务隔离=已提交

谢谢!

我怀疑它与 docs这条线有关系 –

The primary query and the WITH queries are all (notionally) executed
at the same time. This implies that the effects of a data-modifying
statement in WITH cannot be seen from other parts of the query,other
than by reading its RETURNING output. If two such data-modifying
statements attempt to modify the same row,the results are
unspecified.

虽然我认为ID可能是可用的,因为它在WITH子查询中没有更改,但可能会有一些行可见性.术语“未指定”是非常模糊的,这可能是postgres列表的一个问题,所以一个大师可以有一个裂缝…

编辑:为了提供更多的信息,我也尝试用SELECT *替换DELETE,并返回预期的行.我的立即反应是,如果可以找到返回它们的行,那么应该可以找到它们来删除它们.但是,如果我再考虑一下,此测试支持引用,因为与非数据修改语句配对的数据修改语句会产生预期结果,而两个数据修改语句会产生意想不到的结果.

相关文章

来源:http://www.postgres.cn/docs/11/ 4.1.1. 标识符和关键词 SQL标识符和关键词必须以一个...
来源:http://www.postgres.cn/docs/11/ 8.1. 数字类型 数字类型由2、4或8字节的整数以及4或8...
来源:http://www.postgres.cn/docs/11/ 5.1. 表基础 SQL并不保证表中行的顺序。当一个表被读...
来源:http://www.postgres.cn/docs/11/ 6.4. 从修改的行中返回数据 有时在修改行的操作过程中...
来源:http://www.postgres.cn/docs/11/ 13.2.1. 读已提交隔离级别 读已提交是PostgreSQL中的...
来源:http://www.postgres.cn/docs/11/ 9.7. 模式匹配 PostgreSQL提供了三种独立的实现模式匹...