我试图在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子语句和主查询之间通信更改的唯一方法。
<一口>(强调我的)一口>