我怀疑我可能会尝试做一些不可能的事情。但我想检查并确认。
我从使用非数字主键的外部数据库中获取数据。我们必须在我们自己的数据库中保存这些数据的副本,并且我们希望为主键使用自动生成的标识整数。所以我创建了一个具有正常身份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?
答案 0 :(得分:1)
外键可以引用另一个表的主键或具有唯一约束的键。因此,如果您的Agency表包含两列
如果Id是主键,它可以自动用作外键。要将LinkedAgency用作外键,必须在其上声明唯一约束。
答案 1 :(得分:1)
标题中问题的答案是:是的,您可以在没有聚集索引的情况下创建外键关系。
T-SQL要求FK关系中的一列是PK或唯一索引。
原因是远程列是用于“查看”的列。 up'远程端的主数据(如在master-detail中):如果远程(主)端的密钥数据不唯一,则无法在一堆N行中识别匹配的'master'行同样的关键。
这不是SQL或T-SQL带给您的技术问题,而是数据中的逻辑问题:您将遇到困难时间和在excel电子表格中查找相同主数据的相同问题位于具有重复ID的列上。
上面引出了一个关于数据的问题:如果主表中的id不唯一,如何在源应用程序中查找主数据?
如果你能得到这个问题的答案,你可能能够理解如何建立这种外键关系。
我的非常疯狂的猜测是有一些列丢失或者导出有点破坏。