考虑以下脚本,我在Microsoft SQL Server 2012中运行:
create table PKTestTable1 (
Column1 int not null,
Column2 int not null,
constraint PK_PKTestTable1 primary key (
Column1,
Column2
)
)
create table FKTestTable1 (
Column1 int not null,
Column2 int not null
)
alter table FKTestTable1 add foreign key (Column1, Column2) references PKTestTable1(Column1, Column2)
alter table FKTestTable1 add foreign key (Column1, Column2) references PKTestTable1(Column1, Column2)
以前,如果我曾要求SQL Server“找到指向表1中按顺序将列A,B和C指向列D,E和F的外键,表2中的那个,”我会预计不会超过一行返回。运行此脚本时,我原本希望SQL Server在引用重复时显示错误,但事实并非如此。而是使用不同的自动生成名称创建两个外键。据我所知,除了名字外,这些外键在各方面都完全相同。
我意识到我可以通过命名我的约束来避免这种情况 - 这不是问题所在。令人困惑的是,允许多个外键以完全相同的定义存在。我的问题是:为什么SQL Server允许这样做?
答案 0 :(得分:1)
外键可以有其他属性。在我的脑海里,就像删除级联"之类的东西。通过允许"重复",你可以改变你对这些属性应该是什么的想法。例如:
在这种情况下,您的数据始终受到至少一个外键的保护。