T-SQL:你可以在没有聚集索引的情况下创建外键关系吗?

时间:2016-09-23 13:35:09

标签: sql-server

我怀疑我可能会尝试做一些不可能的事情。但我想检查并确认。

我从使用非数字主键的外部数据库中获取数据。我们必须在我们自己的数据库中保存这些数据的副本,并且我们希望为主键使用自动生成的标识整数。所以我创建了一个具有正常身份PK的表,然后在列上设置一个唯一约束来保存"其他"主键。

我们引入的数据还有来自另一列的自引用外键。我需要重新创建这个。所以我尝试在T-SQL中构建它:

ALTER TABLE [Client] 
ADD CONSTRAINT [ClientCode_Unique] UNIQUE NONCLUSTERED 
(
    [ClientCode] ASC
)

ALTER TABLE [Client]
    WITH CHECK ADD CONSTRAINT FK_Client_Agency 
    FOREIGN KEY (ClientCode) REFERENCES Client(LinkedAgency)

然而,这导致了一个错误:

  

引用的表中没有主键或候选键   '客户机'与外键中的引用列列表匹配   ' FK_Client_Agency'

据我所知,T-SQL要求FK关系中的一列是PK或Clustered Index。我已经在桌面上有一个Clustered PK,所以我想我无法创建密钥。另一种方法是添加另一个引用实际PK的列,并确保它在引用数据的代码中正确填充。

这是正确的,还是有其他方法可以创建FK?

2 个答案:

答案 0 :(得分:1)

外键可以引用另一个表的主键或具有唯一约束的键。因此,如果您的Agency表包含两列

  • 编号
  • LinkedAgency

如果Id是主键,它可以自动用作外键。要将LinkedAgency用作外键,必须在其上声明唯一约束。

答案 1 :(得分:1)

标题中问题的答案是:是的,您可以在没有聚集索引的情况下创建外键关系。

T-SQL要求FK关系中的一列是PK或唯一索引。
原因是远程列是用于“查看”的列。 up'远程端的主数据(如在master-detail中):如果远程(主)端的密钥数据不唯一,则无法在一堆N行中识别匹配的'master'行同样的关键。

这不是SQL或T-SQL带给您的技术问题,而是数据中的逻辑问题:您将遇到困难时间和在excel电子表格中查找相同主数据的相同问题位于具有重复ID的列上。

上面引出了一个关于数据的问题:如果主表中的id不唯一,如何在源应用程序中查找主数据?
如果你能得到这个问题的答案,你可能能够理解如何建立这种外键关系。

我的非常疯狂的猜测是有一些列丢失或者导出有点破坏。