一尘不染

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

sql

我有一个使用软删除的简单架构(这是设计方式,不能更改)。有参与模式两个表:Company (id, is_deleted)Employee (id, company_id, is_deleted)其中company_idofcourse是一个FK的Company表。规则是:

  • 如果Companyis_deleted = true,那么所有Employee提到该公司的人都应该有is_deleted = true
  • 但是,即使父母有,Employee也可能有。is_deleted = true``Company``is_deleted = false

我的两个问题是:a)如何强制执行这些约束?b)如何最轻松地确保is_deleted = trueCompany软删除a时将其级联。

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


阅读 225

收藏
2021-03-08

共1个答案

一尘不染

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

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

但这不适用于 您的 情况,因为您需要允许引用值 不同于 引用值。

因此,就您而言,我认为您有三个选择。

  • 扳机
  • 储存程序
  • 申请代码

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

2021-03-08