2013-05-18 2 views
2

У меня есть таблица с двумя столбцами в качестве первичного ключа. Эти две колонны также внешний ключ, который ссылается на ту же таблицу: (Эта таблица была создана некоторое время назад кто-то с тех пор покинул компанию)Задание внешних ключей Первичный ключ в той же таблице

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, и ItemListID больше нигде не найден в базе данных, но в приложении есть соответствующее перечисление.

Есть ли причина, по которой первичный ключ должен быть внешним ключом, ссылающимся на себя (т. Е. Некоторое недокументированное повышение производительности), или это просто ошибка?

ответ

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 столбец всегда себя ссылки.

Но, как я уже сказал, с вашей текущей таблицей, где и колонки ссылаются только на себя, это бессмысленно.

3

Это как создать иерархию, а также обеспечить, чтобы у вас не было дочернего с недопустимым родителем.

См. Также Should you make a self-referencing table column a foreign key?

+0

Да, это была бы иерархия, если бы был внешний ключ, ссылающийся на первичный ключ в той же таблице, но в этом случае первичный ключ является внешним ключом - поэтому каждая строка действительно ссылается на себя. –

+0

Я уверен, почему нет !!! –