【问题标题】:SQL: Delete parent when child (but is theoretical parent) is deleted in a OneToOne relationshipSQL:在 OneToOne 关系中删除子项(但理论上是父项)时删除父项
【发布时间】:2017-10-02 04:27:18
【问题描述】:

您好,亲爱的 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)。


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

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

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

非常感谢您甚至阅读本文。

【问题讨论】:

  • 您在不提供结构的情况下询问有关结构的问题?..
  • 不知道你的意思和/或需要什么。我的结构有一个图形和一个非常准确的解释。 :-(
  • 首先,请提供格式化文本,而不是图片。其次,您的链接已损坏;)
  • 链接适用于我的多种设备。添加了格式化的文本结构。我已经有了我需要的答案,但也许是这样。有更好的,谁知道呢。希望对您有所帮助。
  • 酷,谢谢。我想了解“(或多或少fk)”背后隐藏的是什么,但你有你的答案,所以没关系。也请阅读meta.stackoverflow.com/questions/285551/…

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


【解决方案1】:

您可以在从 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;(导致我出现“错误:控制到达触发过程结束而没有返回”),但它完全符合我的预期!我只将上面的更改为简单的RETURN NULL。我将进一步研究触发器以及为什么我的解决方法可能是错误的,但现在非常感谢您!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 2016-02-12
相关资源
最近更新 更多