T-SQL:不引用主键的外键

时间:2011-02-11 08:53:48

标签: tsql

我有以下数据库:

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 个答案:

答案 0 :(得分:4)

由于(Id, Revision)上有复合主键ContentNodes,因此您必须在外键关系中使用两列

不能仅引用主键的部分内容 - 根本无法完成。

你必须在你的表中引入一个代理主键,这只是一个简单的INT IDENTITY然后你可以自引用那个单独的PK列,或者你可以(如果你的数据模型中可能的话)放入要引用的那一列上的UNIQUE INDEX

CREATE UNIQUE NONCLUSTERED INDEX UIX_ID 
  ON ContentNodes(Id)

在该列上有UNIQUE INDEX 然后后,您可以将其用作FK参考。