父子关系中级联软删除的方法
问题:父子关系中级联软删除的方法 我有一个使用软删除的简单模式(这就是它的设计方式并且无法更改)。有两个表参与模式:Company (id, is_deleted)和Employee (id, company_id, is_deleted)其中company_id当然是Company表的 FK。规则是: 如果一个Company有is_deleted = true,那么所有引用该公司的Employe
问题:父子关系中级联软删除的方法
我有一个使用软删除的简单模式(这就是它的设计方式并且无法更改)。有两个表参与模式:Company (id, is_deleted)
和Employee (id, company_id, is_deleted)
其中company_id
当然是Company
表的 FK。规则是:
-
如果一个
Company
有is_deleted = true
,那么所有引用该公司的Employee
都应该有is_deleted = true
。 -
但是即使父
Company
有is_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 界面可用于绕过应用程序代码和存储过程中的限制,具体取决于权限。
更多推荐
所有评论(0)