如何选择插入到WITH CTE中的新插入行?



我试图在CTE中选择新插入的行。假设我有一个这样的表:

CREATE TABLE IF NOT EXISTS foo (
name TEXT NOT NULL
);

然后运行如下查询:

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
SELECT * FROM foo;
INSERT INTO foo(name) VALUES('bar');
SELECT * FROM foo;
COMMIT;

在第二次选择中,我可以找到'bar'的行。但是当我把查询改成这样:

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
SELECT * FROM foo;
WITH ins AS (
INSERT INTO foo(name) VALUES('bar') RETURNING *
)
SELECT * FROM foo, ins;
COMMIT;

我不能选择foo中新创建的行。为什么呢?

Dbfiddle

我无法选择foo中新创建的行。为什么呢?

因为这是Postgres中数据修改语句的设计。

引自手册

因此,在WITH中使用数据修改语句时,指定的更新实际发生的顺序是不可预测的。所有语句都在同一个快照中执行(参见第13章),因此它们不能"看到"彼此对目标表的影响。这减轻了行更新的实际顺序不可预测性的影响,并且意味着返回数据是在不同的WITH子语句和主查询之间通信更改的唯一方法。

<一口>(强调我的)

最新更新