问题:父子关系中级联软删除的方法

我有一个使用软删除的简单模式(这就是它的设计方式并且无法更改)。有两个表参与模式:Company (id, is_deleted)Employee (id, company_id, is_deleted)其中company_id当然是Company表的 FK。规则是:

  • 如果一个Companyis_deleted = true,那么所有引用该公司的Employee都应该有is_deleted = true

  • 但是即使父Companyis_deleted = false,Employee也可能有is_deleted = true

我的两个问题是 a) 如何执行这些约束? b) 如何在软删除Company时最简单地确保is_deleted = true是级联的。

我添加了标签 postgresql 和 sql server 因为这些是我最感兴趣的数据库。如果其他 rdbms:es 中还有其他解决方案,我也想听听它们。

解答

严格来说,像这样级联值的唯一方法是使用 ON UPDATE CASCADE。要做到_that_,列“is_deleted”必须是唯一约束的一部分。

仅此一点并不难。如果 company.id 是您的主键,那么这对列 {id, is_deleted} 也将是唯一的。该对列的唯一约束将允许您通过外键引用进行级联更新。

但这在 your 情况下不起作用,因为您需要允许引用值与被引用值_不同_。

所以在你的情况下,我认为你有三个选择。

  • 触发器

  • 存储过程

  • 应用代码

在所有这些情况下,您需要注意权限(可能撤销删除权限)以及可以避免您的代码的情况。例如,dbms 命令行界面和 GUI 界面可用于绕过应用程序代码和存储过程中的限制,具体取决于权限。

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐