Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 用于多个DELETE语句的Postgres变量_Postgresql - Fatal编程技术网

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后面不应该有逗号。请尝试删除该选择之前行末尾的逗号。