Sql Server复合主键

时间:2009-08-06 20:00:52

标签: sql-server sql-server-2008

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

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

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

有谁知道会创造什么?服务器是SQL Server 2008。

2 个答案:

答案 0 :(得分:1)

如果FK字段引用同一表中的另一组两个字段,则表示自连接。例如,如果员工表具有复合主键,(例如DivisionId和EmployeeId,其中employeeIds在每个部门中只是唯一的),然后您希望让每个员工记录识别员工的主管 - 作为另一行同桌。

然后每条记录必须有一个复合的ForeignKey(SupervisorDivisionId,SupervisorId)才能识别出雇员的主管。

如果这两个FK字段引用它们,那么没有正当理由,因为这种方式的约束结构总是令人满意,(它不能是错误的。)因此是没有意义的。

答案 1 :(得分:1)

我相信我找到了原因和IMO这是微软人员做出的非常糟糕的设计决定。

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

所以我可以合理猜测的是,在这5张桌子的某个点上,我开始创建一个FK,以为当我靠近时我已经中止了该操作,然后对表进行了另一次更改,例如添加字段或更改数据类型,然后当我保存表时,我创建了一个意外的FK。我可能会补充一点,它是一个带有我从未设置的参数的FK。

我认为这是一个错误。

编辑:我刚刚发现它实际上比我描述的更糟糕。即使您在外键创建对话框中单击取消按钮,它仍会创建处于暂挂状态的自引用外键。这非常愚蠢。

编辑2:随着我的调查越来越多,这种情况越来越严重。我只是通过关闭SSMS并在保存更改对话框中单击否来保存其中一个自引用FK。我重新打开了SSMS,无论如何都创建了自引用FK。回顾一下,我在创建FK对话框中单击取消,在保存更改对话框中单击否,它创建了一个带有我从未设置的参数的外键。