SQL Server pozwala ci robić wiele głupich rzeczy.
Możesz nawet utworzyć klucz obcy w kolumnie odwołującej się do samego siebie - pomimo faktu, że nigdy nie można go złamać, ponieważ każdy wiersz spełnia ograniczenia na sobie.
Jednym z przypadków skrajnych, w których możliwość utworzenia dwóch kluczy obcych w tej samej relacji byłaby potencjalnie użyteczna, jest fakt, że indeks używany do sprawdzania poprawności kluczy obcych jest określany w czasie tworzenia. Jeśli później pojawi się lepszy (tj. Węższy) indeks, to pozwoliłoby to na utworzenie nowego ograniczenia klucza obcego związanego z lepszym indeksem, a następnie pierwotne ograniczenie zostało usunięte bez żadnej przerwy bez aktywnego ograniczenia.
(Jak w przykładzie poniżej)
CREATE TABLE T1(
T1_Id INT PRIMARY KEY CLUSTERED NOT NULL,
Filler CHAR(4000) NULL,
)
INSERT INTO T1 VALUES (1, '');
CREATE TABLE T2(
T2_Id INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
T1_Id INT NOT NULL CONSTRAINT FK REFERENCES T1 (T1_Id),
Filler CHAR(4000) NULL,
)
ALTER TABLE T1 ADD CONSTRAINT
UQ_T1 UNIQUE NONCLUSTERED(T1_Id)
/*Execution Plan uses clustered index*/
INSERT INTO T2 VALUES (1,1)
ALTER TABLE T2 WITH CHECK ADD CONSTRAINT FK2 FOREIGN KEY(T1_Id)
REFERENCES T1 (T1_Id)
ALTER TABLE T2 DROP CONSTRAINT FK
/*Now Execution Plan now uses non clustered index*/
INSERT INTO T2 VALUES (1,1)
DROP TABLE T2, T1;
Pomijając okres przejściowy, podczas gdy istnieją oba ograniczenia, wszystkie wstawki są sprawdzane pod kątem obu indeksów.