SQL:删除父当孩子(但理论父)在OneToOne关系
你好,亲爱的堆栈溢出社区删除,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 assumepassword_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
(调试或支持的原因)我已经创建了一个孤儿,我必须知道这一点。否则,孤儿将永远留在那个分贝中。
非常感谢你,甚至阅读本文。
您可以在从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();
我不确定'IF NOT FOUND THEN RETURN NULL; END IF;'(导致我到“ERROR:控制到达触发器过程的末尾而没有返回”),但它的工作原理与我所希望的完全相同! 我只是将上面的内容更改为简单的'RETURN NULL'。 我会进一步研究触发器,为什么我的解决方法可能是错误的,但现在非常感谢你! – sdk
你问一个问题,关于你的结构不提供结构.. –
说不上你的意思,和/或需要。有一个图形和一个相当准确的解释我的结构。 :-( – sdk
首先,请提供格式化文本,而不是图片,其次,您的链接已损坏;) –