外键引用同一个表中的主键

时间:2013-05-18 05:05:19

标签: sql sql-server-2008 foreign-keys

我有一个包含两列作为主键的表。这两列也是引用同一个表的外键: (此表是前一段时间由某人离开公司创建的)

CREATE TABLE [dbo].[tblItemLink](
    [ItemListID] [int] NOT NULL,
    [ItemID] [int] NOT NULL,
 CONSTRAINT [PK_tblItemList] PRIMARY KEY CLUSTERED 
(
    [ItemListID] ASC,
    [ItemID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[tblItemLink]  WITH CHECK ADD  CONSTRAINT [FK_tblItemLink_tblItemLink] FOREIGN KEY([ItemListID], [ItemID])
REFERENCES [dbo].[tblItemLink] ([ItemListID], [ItemID])
GO

ALTER TABLE [dbo].[tblItemLink] CHECK CONSTRAINT [FK_tblItemLink_tblItemLink]
GO

实际上,ItemID引用tblItem.ItemID,并且在DB中找不到ItemListID,但应用程序中有相应的枚举。

是否有任何理由让主键也成为引用自身的外键(即一些未记录的性能改进),还是只是一个错误?

2 个答案:

答案 0 :(得分:4)

我知道没有理由为什么这可以提供一个好处 - 所以我将选择2 - 一个错误。

当然,如果它是同一个表中的不同列,那就没有意义,正如@ Jignesh.Raj所指出的那样,这将构成某种层次结构。

有时甚至可以在同一个表中使用多列引用结束多个层次结构:

CREATE TABLE T (
   GroupID int not null,
   ItemID int not null,
   ParentItemID int null,
   constraint PK_T PRIMARY KEY (GroupID,ItemID),
   constraint FK_T_Parent FOREIGN KEY (GroupID,ParentItemID) references T (GroupID,ItemID)
)

在上文中,GroupID列始终引用自身。

但正如我所说,使用您当前的表格,其中两个列仅引用自己,这没有任何意义。

答案 1 :(得分:3)

这就是你如何创建一个层次结构,也可以确保你不能让一个孩子的父母无效。

另见Should you make a self-referencing table column a foreign key