Angenommen, wir haben eine Tabelle, für die eine Fremdschlüsseleinschränkung gilt:
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
Diese Tabelle enthält die folgenden Datensätze:
FooId ParentFooId
----- -----------
1 3
2 1
3 2
Es gibt Fälle, in denen diese Art von Design sinnvoll sein könnte (z. B. die typische Beziehung "Mitarbeiter und Chef-Mitarbeiter"), und auf jeden Fall: Ich bin in einer Situation, in der ich dies in meinem Schema habe.
Diese Art von Design ermöglicht leider eine Zirkularität in Datensätzen, wie im obigen Beispiel gezeigt.
Meine Frage ist dann:
- Ist es möglich , eine Einschränkung zu schreiben, die dies überprüft? und
- Ist es möglich , eine Einschränkung zu schreiben, die dies überprüft? (bei Bedarf nur bis zu einer bestimmten Tiefe)
Für Teil (2) dieser Frage kann es relevant sein zu erwähnen, dass ich nur Hunderte oder in einigen Fällen Tausende von Datensätzen in meiner Tabelle erwarte, die normalerweise nicht tiefer als etwa 5 bis 10 Ebenen verschachtelt sind.
PS. MS SQL Server 2008
Update 14. März 2012
Es gab mehrere gute Antworten. Ich habe jetzt die akzeptiert, die mir geholfen hat , die erwähnte Möglichkeit / Machbarkeit zu verstehen . Es gibt jedoch noch einige andere gute Antworten, einige auch mit Implementierungsvorschlägen. Wenn Sie also mit derselben Frage hier gelandet sind, sehen Sie sich alle Antworten an;)