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

2024-01-26

只是感兴趣,为什么下面的(简化的)示例会这样工作。

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);

Result:
DELETE 0

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

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

Thanks!


我怀疑这与中的这一行有关docs http://www.postgresql.org/docs/9.2/static/sql-select.html#SQL-WITH -

主查询和WITH查询都(理论上)被执行 同时。这意味着数据修改的影响 从查询的其他部分看不到WITH中的语句,其他 而不是通过读取其 RETURNING 输出。如果两个这样的数据修改 语句尝试修改同一行,结果是 未指定。

虽然我认为 ID 是可用的,因为它在 WITH 子查询中没有改变,但行可见性可能会发生问题。 “未指定”一词相当模糊,这可能确实是 postgres 列表的一个问题,以便其中一位专家可以破解它......

编辑:为了提供更多信息,我还尝试替换DELETE with SELECT *,这返回了预期的行。我的第一反应是,如果它能找到返回它们的行,它应该能够找到它们并删除它们。但如果我仔细考虑一下,这个测试支持了这个引用,因为数据修改语句与非数据修改语句配对会产生预期的结果,而两个数据修改语句会产生意外的结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐