【问题标题】:Cascade Delete in Postgres: Delete from Child & Parent Tables with Saved IDs from ChildPostgres 中的级联删除:从子表和父表中删除,并从子表中保存 ID
【发布时间】:2022-01-06 23:08:32
【问题描述】:

在 Postgres 中,我有两个表需要使用级联删除来清除一些数据:

- PARTICIPANTS_T: has a foreign key USER_ID on USERS_T.ID
- USERS_T

第一步是从满足条件的 PARTICIPANTS_T 中删除,例如

delete from PARTICIPANTS_T where VALID_FLAG = 'Y';

第二个是从USERS_T中删除之前删除中引用了ID的行。

delete from USERS_T where ID = [..from Step 1..]

如何在 Postgres 中进行级联删除?

我考虑过保存在一个变量中:select INTO

if exists drop table user_ids; --This syntax is wrong select id into user_ids from users_t where id in ( select user_id from participants_t where valid_flag = 'Y');

但这很不方便,因为user_ids 变成了需要维护的单独表。我上面的语法不正确。任何人都可以通过这 2 个步骤给出一个完整的可重复脚本吗?

【问题讨论】:

  • 你可以在删除时使用级联!!!在表 1 上

标签: sql postgresql


【解决方案1】:

这有效:围绕级联删除开始/提交:

begin;
delete from participants_t where valid_flag = 'Y';
delete from users_t where id in (
            select user_id from participants_t where valid_flag = 'Y');       
commit;

【讨论】:

    【解决方案2】:

    我使用WITH 结构从 N 个表中级联删除。 在您的情况下,我建议:

    WITH participants AS (
        DELETE FROM PARTICIPANTS_T participants
        WHERE VALID_FLAG='Y'
        RETURNING participants.ID AS del_ids
        )
    DELETE FROM USERS_T users
    WHERE users.ID in (SELECT del_ids FROM participants);
    

    我个人通过添加另一个表来使用此查询(3 个表通过 ID 连接)。要将此解决方案与更多表一起使用,您可以执行以下操作:

    WITH participants AS (
        DELETE FROM PARTICIPANTS_T participants
        WHERE VALID_FLAG='Y'
        RETURNING participants.ID AS del_ids
        )
        , additional_table AS (
        DELETE FROM ADDITIONAL_TABLE add_table
        WHERE add_table.ID in (SELECT del_ids FROM participants)
        )
    DELETE FROM USERS_T users
    WHERE users.ID in (SELECT del_ids FROM participants);
    

    要记住的一件事 - 查询是从 UP 到 DOWN 执行的,所以首先您需要删除保留 FOREIGN_KEY 的表。最后一个表应该是保持连接键为PRIMARY_KEY的表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 2021-10-21
      • 2021-12-09
      • 1970-01-01
      相关资源
      最近更新 更多