SQL Server cho phép bạn làm rất nhiều điều ngớ ngẩn.
Bạn thậm chí có thể tạo một khóa ngoại trên một cột tham chiếu chính nó - mặc dù thực tế là điều này không bao giờ có thể bị vi phạm vì mỗi hàng sẽ tự đáp ứng các ràng buộc.
Trường hợp một cạnh trong đó khả năng tạo hai khóa ngoại trên cùng một mối quan hệ sẽ có khả năng hữu ích là vì chỉ mục được sử dụng để xác thực khóa ngoại được xác định tại thời điểm tạo. Nếu một chỉ số tốt hơn (nghĩa là hẹp hơn) xuất hiện muộn hơn thì điều này sẽ cho phép một ràng buộc khóa ngoại mới được tạo ràng buộc vào chỉ mục tốt hơn và sau đó ràng buộc ban đầu giảm xuống mà không có bất kỳ khoảng cách nào không có ràng buộc hoạt động.
(Như trong ví dụ dưới đây)
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;
Như một phần dành cho giai đoạn tạm thời trong khi cả hai ràng buộc tồn tại, bất kỳ phần chèn nào cuối cùng cũng được xác nhận đối với cả hai chỉ mục.