如何防止自引用表变成圆形

问题描述 投票:13回答:4

这是一个非常普遍的问题,但是我还没有找到我想要的确切问题和答案。

[我有一个表,其中的FK指向其自己的PK,以启用任意深度的层次结构,例如经典的tblEmployee,其列Manager是带有PK tblEmployee.EmployeeID的FK。

比方说,在我的应用中,用户

  1. [创建新员工Alice和Dave,没有经理,因为他们是CEO和总裁。因此,对于这两个记录,tblEmployee.Manager为NULL。
  2. [创建新员工Bob,以Alice为经理。然后以鲍勃为经理创建查尔斯。他们的Manager字段包含tblEmployee中另一条记录的主键值。
  3. [编辑Alice的员工记录,这意味着指派Dave有她的经理(这很好),但无意中将Alice的经理设置为Charles,比树中的Alice低两级。
  4. 现在表在循环引用中,而不是适当的树中。

确保在应用程序中执行步骤3 无法完成

最佳方法是什么?我只需要确保它会拒绝执行该上次SQL更新,而显示一些错误消息即可。

我对它是SQL Server中的数据库约束(已在2008或2012年工作)还是在C#应用程序的业务逻辑层中使用某种验证例程并不挑剔。

这是一个非常普遍的问题,但是我还没有找到我想要的确切问题和答案。我有一个表,其中的FK指向其自己的PK,以启用任意深度的层次结构,...

c# sql sql-server circular-reference
4个回答
17
投票

您可以使用CHECK CONSTRAINT来执行此操作,以确认管理员ID不是周期。检查约束中不能包含复杂的查询,但是如果首先将其包装在函数中,则可以:


2
投票

您可以添加“级别”整数列。


1
投票

您可以在UPDATE语句中加入支票:


0
投票

我认为最好的方法是:

© www.soinside.com 2019 - 2024. All rights reserved.