代码之家  ›  专栏  ›  技术社区  ›  tom

查询的其余部分看不到对内部所做的修改?

  •  0
  • tom  · 技术社区  · 7 年前

    我有一个层次结构:

    CREATE TABLE thing (
      id serial NOT NULL,
      CONSTRAINT thing_pkey PRIMARY KEY (id)
    )
    
    CREATE TABLE thingthing (
      part integer NOT NULL,
      cont integer NOT NULL,
      CONSTRAINT thingthing_part_fkey FOREIGN KEY (part) REFERENCES thing (id),
      CONSTRAINT thingthing_cont_fkey FOREIGN KEY (cont) REFERENCES thing (id)
    )
    

    我编写了一个查询,它断开一个事物与另一个事物的连接,如果它不再与任何其他事物连接,也应该删除它。

    WITH cte AS (
      DELETE FROM thingthing
      WHERE part = $1 AND cont = $2
    )
    DELETE FROM thing
    WHERE id = $1 AND id NOT IN (SELECT part FROM thingthing)
    

    问题是第二个 DELETE 从来没有跑过,结果我在 thing 不与其他表连接的表。

    我的问题是为什么第一次 删除 已从中删除最后一条记录 thingthing 哪里 part $1 作为价值。在这种情况下,我希望 id NOT IN (SELECT part FROM thingthing) 说实话,但事实并非如此。

    1 回复  |  直到 7 年前
        1
  •  1
  •   a_horse_with_no_name    7 年前

    Quote from the manual

    所有语句都使用相同的快照执行(请参见 Chapter 13 ,所以他们不能看到对方对目标表的影响。[…]这意味着返回数据是在不同的子语句和主查询之间传递更改的唯一方法。

    推荐文章