postgresql - 多个 DELETE 语句的 Postgres 变量
问题描述
我们有一些没有级联设置的表,但我们想在删除项目时使用一个命令手动清理它们。
例如,要删除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);
这不起作用,但我认为它说明了目标。
有没有一种方法可以在多个表中完成此 DELETE,而无需多次写入identifier
值?
解决方案
将“项目”删除移动到 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;
推荐阅读
- python - Flask 没有得到正确的端口
- java - 对 GCC 编译的 C 库的 Java 调用有效,但在使用 G++ 编译时失败
- azure-eventgrid - ARM 隐式创建事件网格系统主题。事件网格订阅如何附加到自定义事件网格主题
- c# - MVVM 灯不会创建 ViewLocator
- wordpress - 在运输详细信息 Woocommerce 下移动付款表格
- google-sheets - 我如何过滤只有时间的谷歌表格查询?
- azure - DNN Site azure DevOps 构建管道错误
- excel - 调用另一个子时 ByRef 类型不匹配
- django - 为 DeleteView 类编写的额外函数不起作用
- c++ - D3D12 SDKLayers dll 与 D3D12 Core dll 的 D3D12SDKVersion 不匹配