代码之家  ›  专栏  ›  技术社区  ›  jhale

SQL Server复合主键

  •  1
  • jhale  · 技术社区  · 17 年前

    我今天在我的数据库中发现了一些我无法解释的东西。我注意到在我的一个表中有一个外键,它由两个字段组成,这些字段引用了同一个表中的同两个字段。这两个字段也是构成复合主键的同两个字段。例如:

    Table: Listings
    Primary Key: MlsNumber (int), MlsBoard (int)
    Foreign Key: PK Table: Listings (MlsNumber, MlsBoard) FKTable: Listings(MlsNumber, MlsBoard)
    

    当我看到这个的时候,我以为我是在某个时候偶然创造出来的。然后我在同一个数据库的另外4个表中发现了同样的东西。我是唯一能修改这个数据库的人,这不是我故意做的。我确实注意到,在我找到它的每种情况下,它都在一个具有复合主键的表上。我在同一个数据库中有许多其他表,这些表具有复合主键,并且不包含这个奇怪的外键。

    有人知道这是什么造成的吗?服务器是SQL Server 2008。

    2 回复  |  直到 17 年前
        1
  •  1
  •   Charles Bretana    17 年前

    如果FK字段引用同一表中两个字段的不同集合,那么这表示一个自联接。例如,如果一个雇员表有一个复合主键(例如divisionID和employeeID,其中employeeID在每个部门中都是唯一的),那么您希望让每个雇员记录标识雇员的主管-作为同一表中的另一行。

    然后,每个记录都必须有一个复合的foreignkey(supervisordivisionid,supervisorid),以便识别员工的主管。

    如果这两个FK字段引用了它们自己,那么这是没有正当理由的,因为这样的约束结构将永远是satisiefd(它不能是false)。因此毫无意义。

        2
  •  1
  •   jhale    17 年前

    我相信我已经找到了原因,而在我看来,这是微软人一个非常糟糕的设计决策。

    我去创建一个新的外键,并设置主键表和外键表及其列。然后我意识到在创建外键之前需要清除表中的数据,所以我单击了关闭。我发现这会创建一个挂起的外键,正如我在问题中描述的那样,一个由引用自身的主键字段组成的FK。

    所以我可以合理地猜测,在这5个表上的某个时刻,我开始创建一个fk,我认为我在单击“关闭”时中止了该操作,然后对表进行了另一个更改,例如添加字段或更改数据类型,然后在保存表时,我意外地创建了一个fk。我可能会补充说,这是一个FK的参数我从来没有设置。

    我认为这是一个错误。

    编辑:我刚刚发现它实际上比我描述的还要糟糕。即使单击“创建外键”对话框上的“取消”按钮,它仍会在挂起状态下创建自引用外键。这太愚蠢了。

    编辑2:我调查的越多,情况就越糟。我只是通过关闭SSMS并单击“保存更改”对话框上的“否”来保存这些自引用FK中的一个。我重新打开SSMS,并且无论如何都创建了自引用FK。简单回顾一下,我在CreateFK对话框中单击了Cancel,在SaveChanges对话框中单击了No,它用我从未设置过的参数创建了一个外键。

    推荐文章