Sql server Sql Server复合主键

Sql server Sql Server复合主键,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我今天在我的一个数据库中发现了一些我无法解释的东西。我注意到在我的一张表上有一个外键,它由两个字段组成,引用了同一张表上的两个字段。这两个字段也是构成复合主键的相同两个字段。例如: Table: Listings Primary Key: MlsNumber (int), MlsBoard (int) Foreign Key: PK Table: Listings (MlsNumber, MlsBoard) FKTable: Listings(MlsNumber, MlsBoard) 当我看到

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

Table: Listings
Primary Key: MlsNumber (int), MlsBoard (int)
Foreign Key: PK Table: Listings (MlsNumber, MlsBoard) FKTable: Listings(MlsNumber, MlsBoard)
当我看到这个时,我想我是在某个时候意外地创建了它。然后我在同一数据库中的另外4个表中发现了相同的东西。我是唯一可以修改这个数据库的人,这不是我故意做的。我确实注意到,在我找到它的每一个地方,它都位于一个具有复合主键的表上。我在同一个数据库中有许多其他表,它们具有复合主键,并且不包含这个奇怪的外键


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

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

然后,每个记录都必须有一个复合外键(SupervisorDivisionId,SupervisorId),以便识别员工的主管


如果这两个FK字段引用它们自己,那么就没有合理的理由,因为这样的约束结构总是令人满意的(不可能是错误的),因此是毫无意义的。

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

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

因此,我可以合理地猜测,在这5个表的某个点上,我开始创建一个FK,当我点击close时,我认为我已经中止了该操作,然后对表进行了另一个更改,例如添加字段或更改数据类型,然后当我保存表时,我创建了一个意外的FK。我可以补充一点,那是一个FK,带有我从未设置过的参数

我认为这是一个错误

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


编辑2:我调查得越多,情况就越糟。我刚刚通过关闭SSM并单击“保存更改”对话框上的“否”来保存这些自引用FK之一。我重新打开了SSMS,但还是创建了自引用FK。简单回顾一下,我在“创建FK”对话框中单击了“取消”,在“保存更改”对话框中单击了“否”,它创建了一个带有我从未设置过的参数的外键。

情况并非如此。我创建了数据库,当然我不是故意创建这些FK的。在其中一个表中,组成PK和FK的两个字段是表中仅有的两个字段,因此在此表上执行自联接是没有意义的。因此,您的问题(问题?)是谁(或什么)实际创建了这些FK。服务器不是自己做的,所以要么其他人有权访问服务器,要么是你自己无意中做的。。。在类似的情况下,我经常发现一些问题或问题实际上是我自己的责任或误解……我想我做了一些手术,造成了这些问题,因为我是唯一有权这样做的人。但是,我实际上并不是通过GUI或Transact-SQL创建外键来创建它们的。我可能犯过一次这样的错误,但不是五次。当数据库中少于5%的表为空时,它每次出现在复合主键表上的几率为零。我的问题是,是否有人知道是否还有其他操作会创建类似的内容。当您第一次打开对话框创建新外键时,您会注意到默认的外键表是在其上创建键的表,默认列是该表的主键列!