用于多个 DELETE 语句的 Postgres 变量

Tyl*_*ler 1 postgresql

我们有一些表没有设置级联,但我们希望在删除项目时使用一个命令手动清理它们。

例如,要使用 删除Permissions表和Votes基于项目的表identifier = 'abcdefg',我们要首先查找项目的表id,然后使用它来删除相关表:

WITH proj_id AS (
  SELECT id FROM "Projects" WHERE identifier = 'abcdefg'
)

DELETE FROM "Permissions" WHERE project_id IN (proj_id);
DELETE FROM "Votes" WHERE project_id IN (proj_id);
DELETE FROM "Gadgets" WHERE project_id IN (proj_id);
...
DELETE FROM "Projects" WHERE id IN (proj_id);
Run Code Online (Sandbox Code Playgroud)

这不起作用,但我认为它说明了目标。

有没有一种方法可以跨多个表完成此删除,而无需identifier多次写入该值?

Tho*_*own 7

将“Projects”删除移动到WITH子句中,并使其返回proj_id列。然后用逗号分隔 DELETE 子句,使它们成为公用表表达式的一部分。

例如:

WITH proj_id AS (
  DELETE FROM "Projects"
  WHERE identifier = 'abcdefg'
  RETURNING id
),
perm_del AS (
  DELETE FROM "Permissions" p
  USING proj_id
  WHERE p.project_id = proj_id.id),
vote_del AS (
  DELETE FROM "Votes" v
  USING proj_id
  WHERE v.project_id = proj_id.id),
gadg_del AS (
  DELETE FROM "Gadgets" g
  USING proj_id
  WHERE g.project_id = proj_id.id),
...
SELECT id AS deleted
FROM proj_id;
Run Code Online (Sandbox Code Playgroud)