SQL Server 2008中:在表中的列不匹配现有的主键或唯一约束

问题描述 投票:50回答:11

我需要做出一些改变,以一个SQL Server 2008数据库。

这需要一个新表的创建,并插入新表中引用一个已经存在的表的主键的外键。所以,我想建立我的新tblTwo,它引用tblOne的主键之间的关系。

然而,当我试图做到这一点(通过SQL Server Management Studio中)我得到了以下错误:

在表“tblOne”列不匹配现有的主键或唯一约束

我真的不知道这意味着什么,我想知道如果有周围没有任何办法吗?

sql sql-server foreign-keys foreign-key-relationship
11个回答
79
投票

这意味着,在tblOne主键未正确申报 - 你需要去tblOne并添加主键约束返回到它。

如果你确信tblOne确实有一个主键约束,那么也许有你的DB多个tblOne表,属于不同的模式,并在你的FK约束的引用子句选错了一个。

如果有一个复合键(其中您的评论将指示),那么你必须在你的外键引用包括两列也。需要注意的是一个表不能有多个主键 - 但如果它有一个复合键,你会看到旁边是主键的一部分,每列一个重要标志。


0
投票

我找到了另一种方式来得到这个错误。如果你正试图使在SQL Management Studio中的设计视图中的递归外键(外键主键在同一个表)也会发生这种情况。如果您还没有保存该表的主键,将返回此消息。只要保存表,然后它可以让你创建的外键。


0
投票

如果您在表中有数据,这可能是问题。

在我来说,我在我装在下午3点的帐户表中的一些数据,并在联系表中的一些数据,我装在下午3:10,所以联系表有这样的人不在我的帐户表还有些价值。

我结束了从接触表中删除这些值,然后设法增加一个键没有任何问题。


54
投票

如果你有一个复合键创建FK时的顺序很重要,有时顺序是它不显示方式。

我要做的就是去表1的按键部分,然后选择脚本的主键创建到剪贴板,然后创建一个使用顺序FK如图脚本


5
投票

如果仍然出现这个错误,你遵循了上述所有的答案建议后,一切看起来正确的。

要解决这个问题的方法之一是通过删除主键中的两个表,保存,刷新,再添加。然后尝试再次添加的关系。


4
投票

我有这种情况,导致我这个话题。同样的错误,但另一个原因。也许这将帮助别人。

Table1
ColA (PK)
ColB (PK)
ColC


Table2
ID (PK)
ColA
COLB

当试图在表2建立外键我从相反的顺序组合框中选择值

Table1.ColB = Table2.ColB
Table1.ColA = Table2.ColA

这被扔我的错误,如在主题名称。在创建主键表列的FK维持秩序,因为他们,做出错误消失。

愚蠢的,但.. :)


3
投票

此错误发生与我When我试图add foreign key约束从PrimaryKey Table开始

SimPy中去别的桌子和create this foreign key约束from(foreign key Table)


2
投票

这个问题抓住了我,我将在错误的表之间的关系。所以,如果你想添加表A表B的关系,尝试将表B中表A的关系


0
投票

这看起来像你正试图创建一个tblTwo外键不与任何tblOne主键或唯一索引匹配(或参与)。

检查关于它MSDN此链接。在这里,你有一个practical case另一个链接。

编辑:

回答您的意见,我明白你的意思也有在主键2场(这使它成为一个复合)。在SQL是不可能有在同一个表2的主键。

恕我直言,一个外键字段应该始终是指在引用表中的单个寄存器(即在你的情况下,整个主键)。这意味着你需要在创建外键前就摆在tblTwo的tblOne主键的两个领域。

无论如何,我已经调查了一下在互联网上,它似乎SQL Server 2008的(如一些之前的版本和其他RDBMS)为您提供了可能性,只要这部分是一个候选键(非空引用主键的唯一组成部分,唯一的),你就可以创建一个唯一约束。

我不知道,你可以使用你的情况,但检查这个link关于它的更多信息。


0
投票

我发现,列名必须匹配。

例如:所以,如果tblOne已经CATEGORYID ID叫tblTwo参考也必须叫的categoryId。

_tblname, primary key name, foreign key_
tblOne, "categoryId", none
tblTwo, "exampleId", "categoryId"

要创建2个表,无论有列名“ID”作为主键之间的外键时,我注意到这一点。


0
投票

如果没有什么帮助,那么这可能是原因:考虑到这种情况:表A:第1列(主键)第2列(主键)列第3栏第4

表B:柱一个(主键)b栏c栏

当要定义一个依赖B到A,这样你就被迫尊重其初选定义的顺序。

这意味着你的依赖应该是这样的:表A表B第1米栏第-B柱上2 c栏

AND NOT:表A表B栏第2栏C色谱柱1个b栏

那么这将导致您所遇到的错误。

© www.soinside.com 2019 - 2024. All rights reserved.