我有一个简单的模式,其中使用了软删除(这就是它的设计方式和无法更改的方式)。有两个参与模式的表:Company (id, is_deleted)
和Employee (id, company_id, is_deleted)
其中company_id
ofcourse是Company
表的FK。规则是:
Company
有is_deleted = true
,那么引用该公司的所有Employee
都应该is_deleted = true
。Employee
有is_deleted = true
,Company
也可能有is_deleted = false
。我的两个问题是:a)如何强制执行这些约束? b)如何轻松确保在is_deleted = true
被软删除时级联Company
。
我添加了标签postgresql和sql server,因为那些是我最感兴趣的数据库。如果在其他rdbms中还有其他解决方案:es我也想听听它们。
答案 0 :(得分:4)
严格来说,像这样级联值的唯一方法是使用ON UPDATE CASCADE。要执行 ,列“is_deleted”必须是唯一约束的一部分。
仅此一点并不太难。如果company.id是您的主键,那么列{id,is_deleted}对也将是唯一的。对该列对的唯一约束将允许您通过外键引用级联更新。
但是这不适用于你的情况,因为你需要允许引用值与引用的值不同。
所以在你的情况下,我认为你有三个选择。
在所有这些情况下,您需要注意权限(可能撤销删除权限)以及可以避免代码的情况。例如,dbms命令行界面和GUI界面可用于解决应用程序代码中的约束,并根据权限在存储过程中解决。