如何同时从父表和子表中删除

  • 本文关键字:删除 何同时 postgresql
  • 更新时间 :
  • 英文 :


假设我有两个表

CREATE TABLE IF NOT EXISTS "public"."parent" (
parent_id UUID not null,
name TEXT not null,
)
CREATE TABLE IF NOT EXISTS "public"."child" (
child_id UUID not null,
parent_id UUID not null,
name TEXT not null,
CONSTRAINT "child_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."parent"("parent_id")
)

是否可以这样做:

DELETE FROM parent WHERE parent_id IN (DELETE FROM child WHERE name LIKE '%whatever' RETURNING parent_id)

这个查询返回语法错误。虽然从删除查询返回是可能的,所以内部查询是可以的,这意味着周围的查询不能这样工作。
还有谁能解释一下为什么上面的查询是不可能的?

您需要一个CTE("公共表表达式")。您当前的公式是不可能的,因为它返回语法错误。我不认为有什么深刻的原因。

with d as (DELETE FROM child WHERE name LIKE '%whatever' RETURNING parent_id) 
DELETE FROM parent WHERE parent_id IN (select * from d)