我们有一些表没有设置级联,但我们希望在删除项目时使用一个命令手动清理它们。
例如,要使用 删除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多次写入该值?
将“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)