Answers:
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;
除了过渡期外,同时存在两个约束条件时,最后要根据两个索引对所有插入进行验证。
具有相同的外键约束是没有用的,即在同一列上并引用相同的表和列。
就像两次检查相同或两次以上。