Postgresql 用于多个DELETE语句的Postgres变量
我们有一些没有设置级联的表,但是我们想在删除项目时用一个命令手动清理它们 例如,要基于具有Postgresql 用于多个DELETE语句的Postgres变量,postgresql,Postgresql,我们有一些没有设置级联的表,但是我们想在删除项目时用一个命令手动清理它们 例如,要基于具有标识符='abcdefg'的项目删除权限表和投票表,我们首先要查找项目的id,然后使用该id删除相关表: WITH proj_id AS ( SELECT id FROM "Projects" WHERE identifier = 'abcdefg' ) DELETE FROM "Permissions" WHERE project_id IN (proj_id); DELETE FROM "Vote
标识符='abcdefg'
的项目删除权限
表和投票
表,我们首先要查找项目的id
,然后使用该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);
这不起作用,但我认为它说明了目标
有没有一种方法可以跨多个表完成此删除,而无需多次写入标识符值?将“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;
我在“RETURNING”
处或附近得到语法错误,如果我删除该行(和省略号),我在SELECT id AS deleted处或附近得到语法错误
看起来我忽略了将该语句转换为delete。我现在已经更新了。谢谢你的更新;仍在获取第二个错误error:syntax error位于或接近“SELECT”
第18行:SELECT id AS deleted
最后一个CTE后面不应该有逗号。请尝试删除该选择之前行末尾的逗号。