考虑以下ERD
Order
,
Item
和
Article
实体:
我想删除
Orders
满足a
复杂条件
,然后删除
Items
与这些
订单
,最后删除
Articles
与这些
项目
.
级联删除自
订单
到
项目
可能是
顺序
是的父级
项目
. 但级联从中删除
项目
到
文章
不可能
项目
不是的父级
文章
. 设置触发器也不是一个选项,因为通常我不想删除
文章
每当
项目
已删除-它只应在该查询的上下文中发生。
我正在使用PostgreSQL,它支持
DELETE ... RETURNING
声明。不幸的是,结果
不能
嵌套方式如下:
DELETE FROM articles WHERE id IN
(DELETE FROM items WHERE order_id IN
(DELETE FROM orders WHERE complex_condition RETURNING id)
RETURNING article_id)
执行这三条delete语句最有效的方法是什么?每个表包含数千万条记录
complex_condition
是最耗时的部分,所以我不希望执行多次。
我的一个想法是创建这样一个临时表:
CREATE TEMP TABLE id_of_order_to_be_deleted
AS
WITH cte1 AS (SELECT id FROM orders WHERE complex_condition)
SELECT *
FROM cte1;
然后使用它删除
订单
和
项目
. 这边
复杂的\u条件
仅评估一次。但我认为这是一种过分的做法,应该有一个更简单的解决方案。