2

你好,亲爱的堆栈溢出社区删除,SQL:删除父当孩子(但理论父)在OneToOne关系

我搜索了很多时间已经,但我无法找到一个解决办法我非常独特的场景。
也许你们可以帮忙。我们假设我们有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

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

现在到了在这种情况下相当独特的案例:
domain_realm持有password_policy_id(或多或少FK)而不是password_policy持有的外键它的父。

Why would someone do this?
Let's assume password_policy is part of a package for many other applications not working with domain realms. Therefore keeping the table clean of any specific rows no other application needs (e.g. fk_domain_relam) is mandatory.


现在看来是不可能删除domain_realm时自动删除(ON DELETE CASCADE)的相关password_policy

有没有办法做到这一点的SQL方式或我必须知道这并确保password_policy被删除在我的代码?

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

非常感谢你,甚至阅读本文。

+0

你问一个问题,关于你的结构不提供结构.. –

+0

说不上你的意思,和/或需要。有一个图形和一个相当准确的解释我的结构。 :-( – sdk

+1

首先,请提供格式化文本,而不是图片,其次,您的链接已损坏;) –

回答

0

您可以在从domain_realm删除后创建触发器。我不是100%地肯定在PostgreSQL的语法,但它应该是这个样子:

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(); 
+0

我不确定'IF NOT FOUND THEN RETURN NULL; END IF;'(导致我到“ERROR:控制到达触发器过程的末尾而没有返回”),但它的工作原理与我所希望的完全相同! 我只是将上面的内容更改为简单的'RETURN NULL'。 我会进一步研究触发器,为什么我的解决方法可能是错误的,但现在非常感谢你! – sdk