Załóżmy, że mamy tabelę, która ma dla siebie ograniczenie klucza obcego, takie jak:
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
Ta tabela będzie zawierać następujące rekordy:
FooId ParentFooId
----- -----------
1 3
2 1
3 2
Są przypadki, w których ten rodzaj projektu może mieć sens (np. Typowa relacja „pracownik-szef-pracownik”), a w każdym razie: jestem w sytuacji, w której mam to w swoim schemacie.
Ten rodzaj konstrukcji niestety pozwala na zachowanie okrągłości w rekordach danych, jak pokazano w powyższym przykładzie.
Moje pytanie brzmi zatem:
- Czy można napisać ograniczenie, które to sprawdza? i
- Czy jest możliwe napisanie ograniczenia, które to sprawdza? (w razie potrzeby tylko do określonej głębokości)
W części (2) tego pytania warto wspomnieć, że oczekuję tylko setek, a może w niektórych przypadkach tysięcy rekordów w mojej tabeli, zwykle nie zagnieżdżonych głębiej niż około 5 do 10 poziomów.
PS. MS SQL Server 2008
Aktualizacja 14 marca 2012 r.
Było kilka dobrych odpowiedzi. Teraz zaakceptowałem ten, który pomógł mi zrozumieć wspomnianą możliwość / wykonalność. Istnieje jednak kilka innych świetnych odpowiedzi, niektóre z sugestiami implementacyjnymi, więc jeśli trafiłeś tutaj z tym samym pytaniem, przejrzyj wszystkie odpowiedzi;)