删除不同表中其他记录引用的记录
Delete records referenced by other records in different tables
我有以下要求:
我需要根据给定的 ID 从一个 table 中删除记录,现在这个 table 被另一个 table 引用,另一个 table 被引用还有另一个 table,最后一个 table 也被另一个 table 引用,所以我有一个这样的链:
table_1 <- table_2 <- table_3 <- table_4
我对 SQL 没有那么多经验,所以我的解决方案涉及使用子查询来执行此操作。
我有这样的东西:
DELETE FROM table_4
WHERE pk_of_table_3 IN
(SELECT id
FROM table_3
WHERE pk_of_table_2 IN
(SELECT id FROM table 2 WHERE pk_of_table_1 = ?
)
)
所以这将清除 table_4 中的记录,这些记录引用了 table_3 中的目标记录。
对于 table_3 我会做这样的事情:
DELETE FROM table_3
WHERE pk_of_table_2 IN
(SELECT id FROM table_2 WHERE pk_of_table_1 = ?)
现在我搬到table_2:
DELETE FROM table_2 WHERE pk_of_table_1 = 5;
所以最后它让我有可能从 table_1 中清理必要的记录,因为它不受任何限制。
我想问一下这是否是可行的解决方案,是否有更好的方法来做到这一点?
使用链接 DELETE 语句的通用 table 表达式执行此操作:
with delete_t1 as (
delete from table_1
where pk = 42
returning pk
), delete_t2 as (
delete from table_2
where pk_of_table_1 in (select pk from delete_t1)
returning pk
), delete_t3 as (
delete from table_3
where pk_of_table_2 in (select pk from delete_t2)
returning pk
)
delete from table_4
where pk_of_table_3 in (select pk from delete_t3);
如果你总是这样做,考虑将外键约束定义为on delete cascade
,那么你只需要从table_1中删除,Postgres会处理剩下的。
我有以下要求:
我需要根据给定的 ID 从一个 table 中删除记录,现在这个 table 被另一个 table 引用,另一个 table 被引用还有另一个 table,最后一个 table 也被另一个 table 引用,所以我有一个这样的链:
table_1 <- table_2 <- table_3 <- table_4
我对 SQL 没有那么多经验,所以我的解决方案涉及使用子查询来执行此操作。
我有这样的东西:
DELETE FROM table_4
WHERE pk_of_table_3 IN
(SELECT id
FROM table_3
WHERE pk_of_table_2 IN
(SELECT id FROM table 2 WHERE pk_of_table_1 = ?
)
)
所以这将清除 table_4 中的记录,这些记录引用了 table_3 中的目标记录。
对于 table_3 我会做这样的事情:
DELETE FROM table_3
WHERE pk_of_table_2 IN
(SELECT id FROM table_2 WHERE pk_of_table_1 = ?)
现在我搬到table_2:
DELETE FROM table_2 WHERE pk_of_table_1 = 5;
所以最后它让我有可能从 table_1 中清理必要的记录,因为它不受任何限制。
我想问一下这是否是可行的解决方案,是否有更好的方法来做到这一点?
使用链接 DELETE 语句的通用 table 表达式执行此操作:
with delete_t1 as (
delete from table_1
where pk = 42
returning pk
), delete_t2 as (
delete from table_2
where pk_of_table_1 in (select pk from delete_t1)
returning pk
), delete_t3 as (
delete from table_3
where pk_of_table_2 in (select pk from delete_t2)
returning pk
)
delete from table_4
where pk_of_table_3 in (select pk from delete_t3);
如果你总是这样做,考虑将外键约束定义为on delete cascade
,那么你只需要从table_1中删除,Postgres会处理剩下的。