SQL:在OneToOne关系中删除子项(但是理论父项)时删除父项

时间:2017-05-04 06:23:01

标签: sql foreign-key-relationship one-to-one postgresql-9.4 cascading-deletes

您好亲爱的Stack Overflow社区,

我已经搜索了好几个小时,但我找不到解决方案,这是我非常独特的情况 也许你们可以帮忙。

我们假设我们有two tables

|domain_realm                     |   | password_policy                        |
|-------------------------------- |   | ---------------------------------------|
|id    domain  password_policy_id |   | id  min_chars  min_numbers  min_length |
|1     1       11                 |   | 11  3          2                       |
|2     1       12                 |   | 12  4          1                       |

一个称为domain_realm,另一个称为password_policy

这是OneToOne关系,因此一个domain_realm只有一个password_policy

现在出现了这种场景中非常独特的案例
domain_realm持有password_policy_id(或多或少fk),而不是password_policy持有其父级的外键。

  

为什么有人这样做?
  我们假设password_policy是许多其他不使用域领域的应用程序的一部分。因此,保持表清除任何其他应用程序所需的任何特定行都是必需的(例如fk_domain_relam)。

现在,删除ON DELETE CASCADE时似乎无法自动删除(password_policy)相关domain_realm

有没有办法以SQL的方式执行此操作,还是必须知道这一点,并确保在我的代码中删除password_policy

这将是非常讨厌的,因为如果我必须直接在数据库中删除domain_realm(调试或支持原因)我已经创建了一个孤儿,我必须知道这一点。否则,孤儿将永远留在那个数据库中。

非常感谢你,甚至读这篇文章。

1 个答案:

答案 0 :(得分:0)

您可以在从domain_realm删除后创建触发器。我对postgresql中的语法不是100%肯定,但看起来应该是这样的:

CREATE OR REPLACE FUNCTION update_policy() RETURNS TRIGGER AS $$
    BEGIN
            DELETE FROM password_policy WHERE password_policy_id = OLD.password_policy_id;
            IF NOT FOUND THEN RETURN NULL; END IF;
    END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER clean_policy
AFTER DELETE ON domain_realm
FOR EACH ROW EXECUTE PROCEDURE update_policy();