SQL Server le permite hacer muchas cosas tontas.
Incluso puede crear una clave externa en una columna que haga referencia a sí misma , a pesar del hecho de que esto nunca se puede violar, ya que cada fila cumplirá la restricción en sí misma.
Un caso extremo en el que la capacidad de crear dos claves externas en la misma relación sería potencialmente útil es porque el índice utilizado para validar claves externas se determina en el momento de la creación. Si aparece un índice mejor (es decir, más estrecho) más tarde, esto permitiría crear una nueva restricción de clave externa vinculada al mejor índice y luego la restricción original se eliminaría sin tener ningún espacio sin restricción activa.
(Como en el ejemplo a continuación)
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;
Como un aparte para el período intermedio mientras existen ambas restricciones, cualquier inserción termina siendo validada contra ambos índices.