删除不同表中其他记录引用的记录

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会处理剩下的。