SQL Server дозволяє робити багато дурних речей.
Ви навіть можете створити зовнішній ключ на стовпчику, що посилається на себе, - незважаючи на те, що це ніколи не може бути порушено, оскільки кожен рядок буде відповідати обмеженню на собі.
Один крайний випадок, коли можливість створення двох зовнішніх ключів на одній взаємозв'язку була б потенційно корисною, тому що індекс, що використовується для перевірки зовнішніх ключів, визначається під час створення. Якщо кращий (тобто вузький) індекс прийде пізніше, то це дозволить створити нове обмеження зовнішнього ключа, пов'язане з кращим індексом, і тоді початкове обмеження знизиться, не маючи розриву без активного обмеження.
(Як у прикладі нижче)
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;
Окрім проміжного періоду, хоча існують обидва обмеження, будь-які вставки в кінцевому підсумку підтверджуються щодо обох індексів.