相关疑难解决方法(0)

具有层次结构的表:创建约束以防止通过外键循环

假设我们有一个对自身有外键约束的表,如下所示:

CREATE TABLE Foo 
    (FooId BIGINT PRIMARY KEY,
     ParentFooId BIGINT,
     FOREIGN KEY([ParentFooId]) REFERENCES Foo ([FooId]) )

INSERT INTO Foo (FooId, ParentFooId) 
VALUES (1, NULL), (2, 1), (3, 2)

UPDATE Foo SET ParentFooId = 3 WHERE FooId = 1
Run Code Online (Sandbox Code Playgroud)

该表将有以下记录:

FooId  ParentFooId
-----  -----------
1      3
2      1
3      2
Run Code Online (Sandbox Code Playgroud)

在某些情况下,这种设计可能有意义(例如典型的“员工-老板-员工”关系),并且无论如何:我处于我的模式中有这种情况的情况。

不幸的是,这种设计允许数据记录中的循环,如上例所示。

那么我的问题是:

  1. 是否可以编写一个约束来检查这个?和
  2. 编写一个检查这个的约束是否可行?(如果只需要一定深度)

对于这个问题的第 (2) 部分,可能需要提及的是,我希望我的表中只有数百或在某些情况下可能有数千条记录,通常嵌套的深度不会超过大约 5 到 10 级。

附注。微软 SQL Server 2008


2012 年 3 月 14 日更新
有几个很好的答案。我现在已经接受了帮助我理解提到的可能性/可行性的那个。不过,还有其他几个很好的答案,其中一些还提供了实施建议,因此,如果您带着相同的问题来到这里,请查看所有答案;)

sql-server-2008 constraint hierarchy

10
推荐指数
3
解决办法
5228
查看次数

标签 统计

constraint ×1

hierarchy ×1

sql-server-2008 ×1