繁体   English   中英

postgres CTE中的多个更新语句

[英]Multiple update statements in postgres CTE

我遇到一个包含多个更新语句的CTE表达式的奇怪问题。

我可以使用以下SQL重现: -

DROP TABLE IF EXISTS foo;
DROP TABLE IF EXISTS baa;
CREATE TABLE foo(id BIGSERIAL, attributes JSONB);
CREATE TABLE baa(id BIGSERIAL, attributes JSON );
INSERT  INTO foo(attributes) SELECT jsonb_build_object('foo', 'baa');

WITH STEP_ONE AS (

    UPDATE foo 
    SET attributes = attributes ||jsonb_build_object('foo2', 'baa2')
    WHERE id = 1
    RETURNING attributes->>'foo' AS foo_att,id

), STEP_TWO AS (
    INSERT INTO baa(attributes)
    SELECT json_build_object('foo', id)
    FROM STEP_ONE
    RETURNING id as baa_id
) 
UPDATE foo
  SET attributes = attributes ||jsonb_build_object('baa', baa_id)
  FROM STEP_TWO
  WHERE id = 1

这不会更新表foo。 但是用“SELECT * FROM STEP_TWO”替换最终更新会显示记录。

这是postgresql中的错误吗? 或者我在关于在CTE中多次更新单个表的文档中遗漏了一些内容?

Postgres版本:

PostgreSQL 11.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9), 64-bit

是的,这是记录在案的

所有语句都使用相同的快照执行(参见第13章 ),因此它们无法“看到”彼此对目标表的影响。

您要么必须重写查询,以便每个表在语句中只修改一次,要么必须运行两个单独的语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM