当前位置: 首页 > 面试题库 >

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

酆勇
2023-03-14
问题内容

我有一个使用软删除的简单架构(这是设计方式,不能更改)。有参与html" target="_blank">模式两个表: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中还有其他解决方案,我也想听听它们。


问题答案:

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

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

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

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

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

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



 类似资料:
  • 我有一些关于“级联”的问题,在我的项目中,我有类别类,每个类可以是父类或子类。但我在同一个类中定义了哪一个是父母还是孩子。父母和孩子之间存在一对多的关系。这是我的实体类 我的问题是;当我删除子类别时,它的成功并没有问题。如果父类别有子类别,则无法删除父类别。 错误消息; Servlet.service()的servlet[调度Servlet]在上下文中与路径[]抛出异常[请求处理失败;嵌套异常or

  • 我有一个非常简单的Spring靴测试 我要从父实体中删除子实体。链接使用的是单向,拥有实体是父实体。我试着给1打电话。,但hibernate最终生成了一个update语句,将parent_name设置为null(而不是delete where parent_name=“father”),这违反了子表中的不可为null约束。 然后我试着打电话给2。,这一次它给出了一个异常。 你如何修复上面的,以使儿

  • 我有以下作者类: 我的问题是这个测试用例中的最后一个断言失败了。如果我向作者添加一本书,它就会自动添加到图书存储库中。但是如果我从存储库中移除一本书,我如何从作者那里移除它呢?

  • 编辑:修改问题以更好地反映问题。此处最初发布的问题 我有一个父实体(< code >上下文)和一个子实体(< code >用户)。父级上的级联“删除”不会删除子级。代码如下:

  • 问题内容: 我准备了一个 小提琴 来演示这个问题。 我想要一种在删除子记录时将其删除到CASCADE到父记录的方法。 例如: 这应该级联到父表并删除记录。 问题答案: 外键仅在另一个方向上起作用:从父级到子级级联删除,因此,当删除父级(引用)记录时,所有子级(引用)记录也会被删除。 如果是1:1关系,则可以创建双向外键关系,其中一侧为,而两侧均为级联。 否则,您将需要在子表上创建一个触发器,以在没

  • 我有两个实体使用Spring和Hibernate