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;
В дополнение к промежуточному периоду, пока существуют оба ограничения, любые вставки заканчиваются проверкой по обоим индексам.