Mit SQL Server können Sie viele dumme Dinge tun.
Sie können sogar einen Fremdschlüssel für eine Spalte erstellen, die auf sich selbst verweist - trotz der Tatsache, dass dies niemals verletzt werden kann, da jede Zeile die Einschränkung für sich selbst erfüllt.
Ein Randfall, in dem die Möglichkeit, zwei Fremdschlüssel in derselben Beziehung zu erstellen, möglicherweise nützlich wäre, besteht darin, dass der zur Überprüfung von Fremdschlüsseln verwendete Index zum Zeitpunkt der Erstellung bestimmt wird. Wenn später ein besserer (dh engerer) Index hinzukommt, kann auf diese Weise eine neue Fremdschlüsseleinschränkung erstellt werden, die an den besseren Index gebunden ist, und die ursprüngliche Einschränkung wird gelöscht, ohne dass eine Lücke ohne aktive Einschränkung besteht.
(Wie im folgenden Beispiel)
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;
Abgesehen von der Zwischenzeit werden alle Einfügungen für beide Indizes validiert, solange beide Einschränkungen bestehen.