【问题标题】:Why does Microsoft SQL Server Allow Foreign Key Duplicates?为什么 Microsoft SQL Server 允许外键重复?
【发布时间】:2015-01-18 03:08:06
【问题描述】:

考虑以下我在 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“找到将 Table1 上的 A、B 和 C 列按顺序指向 Table2 上的 D、E 和 F 列的外键”,我会预计返回的行不超过一行。运行此脚本时,我预计 SQL Server 会显示引用重复的错误,但事实并非如此。相反,使用不同的自动生成名称创建了两个外键。据我所知,这些外键在各方面都完全相同,除了它们的名称。

我意识到我可以通过命名约束来避免这种情况——这不是问题所在。看到允许以完全相同的定义存在多个外键是令人困惑的。我的问题是:为什么 SQL Server 允许这样做?

【问题讨论】:

  • 它允许您创建两个具有相同架构的表,或具有相同定义的视图,或具有相同代码的存储过程。没有什么不妥。在要求 SQL Server 执行之前,您应该了解您的数据库。
  • 并且您可以创建重复索引。 SQL 只会按照您的指示去做。

标签: sql-server tsql foreign-keys duplicates


【解决方案1】:

外键还有其他属性。在我的脑海中,类似于“删除级联”之类的东西。通过允许“重复”,您可以改变对这些属性应该是什么的看法。例如:

  1. 外键已存在
  2. 使用“on delete cascade”创建新的外键
  3. 删除旧的外键

在这种情况下,您的数据始终受到至少一个外键的保护。

【讨论】:

  • 我不认为这就是全部。如果是,是否允许重复主键?如果我对填充因子或列顺序改变主意怎么办?使用您的逻辑,创建具有更新要求的新主键并删除旧主键是有意义的。然而这是不允许的(我认为),因为主键是由它的列和它们的顺序唯一定义的,而不是它的属性。通过扩展,外键由其列、它们的顺序和它们的引用对象唯一定义是有意义的。我这里的逻辑有问题吗?
猜你喜欢
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-15
相关资源
最近更新 更多