我有一个层次结构:
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
表中拥有未与他人连接的东西。
我的问题是,为什么第一个DELETE
已从thingthing
中删除了最后一条记录,而其中part
具有$1
作为值,为什么它没有运行。在这种情况下,我希望id NOT IN (SELECT part FROM thingthing)
为真,但事实并非如此。
答案 0 :(得分:1)
所有语句都使用相同的快照执行(请参见Chapter 13),因此它们无法“看到”彼此对目标表的影响。 [...]表示返回数据是在不同的WITH子语句和主查询之间传递更改的唯一途径。