Supposons que nous ayons une table qui a une contrainte de clé étrangère pour elle-même, comme celle-ci:
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
Ce tableau contiendra les enregistrements suivants:
FooId ParentFooId
----- -----------
1 3
2 1
3 2
Il y a des cas où ce type de conception peut avoir du sens (par exemple la relation typique "employé-patron-employé"), et en tout cas: je suis dans une situation où j'ai ceci dans mon schéma.
Ce type de conception permet malheureusement la circularité des enregistrements de données, comme le montre l'exemple ci-dessus.
Ma question est alors:
- Est-il possible d'écrire une contrainte qui vérifie cela? et
- Est-il possible d'écrire une contrainte qui vérifie cela? (si nécessaire seulement jusqu'à une certaine profondeur)
Pour la partie (2) de cette question, il peut être pertinent de mentionner que je n'attends que des centaines ou peut-être dans certains cas des milliers d'enregistrements dans ma table, normalement pas imbriqués plus profondément qu'environ 5 à 10 niveaux.
PS. MS SQL Server 2008
Mise à jour du 14 mars 2012
Il y a eu plusieurs bonnes réponses. J'ai maintenant accepté celui qui m'a aidé à comprendre la possibilité / faisabilité mentionnée. Il existe cependant plusieurs autres bonnes réponses, certaines avec des suggestions de mise en œuvre également, donc si vous avez atterri ici avec la même question, jetez un œil à toutes les réponses;)