为什么Microsoft SQL Server允许外键重复?

时间:2015-01-18 03:08:07

标签: sql-server tsql foreign-keys duplicates

考虑以下脚本,我在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允许这样做?

1 个答案:

答案 0 :(得分:1)

外键可以有其他属性。在我的脑海里,就像删除级联"之类的东西。通过允许"重复",你可以改变你对这些属性应该是什么的想法。例如:

  1. 外键已存在
  2. 使用"在删除级联"
  3. 上创建新的外键
  4. 删除旧外键
  5. 在这种情况下,您的数据始终受到至少一个外键的保护。