在亲子关系中级联软删除的方法

时间:2012-11-09 12:21:08

标签: sql sql-server postgresql soft-delete

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

  • 如果Companyis_deleted = true,那么引用该公司的所有Employee都应该is_deleted = true
  • 但即使父Employeeis_deleted = trueCompany也可能有is_deleted = false

我的两个问题是:a)如何强制执行这些约束? b)如何轻松确保在is_deleted = true被软删除时级联Company

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

1 个答案:

答案 0 :(得分:4)

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

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

但是这不适用于你的情况,因为你需要允许引用值与引用的值不同

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

  • 触发器
  • 存储过程
  • 申请代码

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