T-SQL: внешний ключ, который не ссылается на первичный ключ - PullRequest
1 голос
/ 11 февраля 2011

У меня есть следующая база данных:

CREATE TABLE ContentNodes
(
   Id UNIQUEIDENTIFIER NOT NULL, 
   Revision INT IDENTITY(1,1) NOT NULL,
   ParentId UNIQUEIDENTIFIER NULL
   PRIMARY KEY (Id, Revision)
)

Как ограничить ParentId только значениями из столбца Id.Попытка сделать ParentId внешним ключом дает мне:

PRINT 'FK_ContentNodes_ParentId_ContentNodes';
ALTER TABLE ContentNodes
ADD CONSTRAINT FK_ContentNodes_ParentId_ContentNodes FOREIGN KEY (ParentId) REFERENCES ContentNodes(Id);
GO

Ошибка:

В ссылочной таблице ContentNodes нет первичных ключей или ключей-кандидатов, которые соответствуют списку столбцов ссылокво внешнем ключе 'FK_ContentNodes_ParentId_ContentNodes'.

1 Ответ

4 голосов
/ 11 февраля 2011

Поскольку у вас есть составной первичный ключ (Id, Revision) на вашем ContentNodes, вы должны использовать оба столбца в отношении внешнего ключа.

Вы не можете ссылаться только на части первичного ключа - просто не может быть сделано.

Вы должны либо ввести суррогатный первичный ключ в вашу таблицу, который является простым INT IDENTITY, а затем вы можете самостоятельно ссылаться на этот единственный PKили вы можете (если это возможно в вашей модели данных) поместить UNIQUE INDEX в этот столбец, на который хотите сослаться:

CREATE UNIQUE NONCLUSTERED INDEX UIX_ID 
  ON ContentNodes(Id)

Как только у вас будет UNIQUE INDEX в этом столбце, затем вы можете использовать его как справочник FK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...