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

时间:2011-01-12 10:41:08

标签: sql sql-server foreign-keys foreign-key-relationship

我需要对SQL Server 2008数据库进行一些更改。

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

但是,当我尝试这样做时(通过SQL Server Management Studio),我收到以下错误:

  

表'tblOne'中的列没有   匹配现有的主键或   UNIQUE约束

我不确定这意味着什么,我想知道它是否有任何解决方法?

11 个答案:

答案 0 :(得分:76)

这意味着tblOne中的主键尚未正确声明 - 您需要转到tblOne并将PRIMARY KEY约束添加回其上。

如果你确定tblOne确实有一个PRIMARY KEY约束,那么你的数据库中可能有多个tblOne表,属于不同的模式,你的FK约束中的references子句选错了。

如果有一个复合键(您的注释会指示),那么您还必须在外键引用中包含这两列。请注意,一个表不能有多个主键 - 但如果它有一个复合键,您将在每个列旁边看到一个键符号作为主键的一部分。

答案 1 :(得分:53)

如果您有复合键,则在创建FK时顺序很重要,有时订单不是如何显示的。

我要做的是转到table1的Keys部分,选择脚本主键作为创建到剪贴板,然后使用脚本中显示的顺序创建FK

答案 2 :(得分:5)

如果您在遵循上述答案的所有建议并且一切正常后仍然出现错误。

解决此问题的一种方法是删除两个表的主键,保存,刷新,然后重新添加。 然后尝试再次添加您的关系。

答案 3 :(得分:4)

我遇到过这种情况导致我这个话题。相同的错误,但另一个原因也许它会帮助别人。

Table1
ColA (PK)
ColB (PK)
ColC


Table2
ID (PK)
ColA
COLB

当尝试在Table2中创建外键时,我以相反的顺序从组合框中选择值

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

这就像主题名称中的错误一样。按原样创建FK保持主键表中列的顺序,使得错误消失。

愚蠢,但是......:)

答案 4 :(得分:2)

这个问题引起了我的注意,我在错误的桌子上添加了关系。因此,如果您尝试将表A中的关系添加到表B,请尝试将表B中的关系添加到表A中。

答案 5 :(得分:2)

我发现此错误When我从add foreign key

开始尝试PrimaryKey Table约束

Simpy转到其他表格create this foreign key约束from那里(foreign key Table)

答案 6 :(得分:0)

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

MSDN上查看此链接。在这里,您有另一个practical case链接。

修改

回答你的评论,我知道你的意思是主键中有2个字段(这使它成为一个复合词)。在SQL中,不可能在同一个表上有2个主键。

恕我直言,外键字段应始终引用引用表中的单个寄存器(即您的案例中的整个主键)。这意味着您需要在创建外键之前将tblOne主键的两个字段都放在tblTwo中。

无论如何,我已经通过互联网进行了一些调查,似乎SQL Server 2008(如某些先前版本和其他RDBMS)只要该部分是候选键,就可以仅引用部分主键(非空和唯一)并且您在其上创建了一个独特的约束。

我不确定您是否可以在您的情况下使用它,但请查看此link以获取更多相关信息。

答案 7 :(得分:0)

我发现列名必须匹配。

实施例: 因此,如果tblOne具有名为categoryId的id,则tblTwo中的引用也必须被称为categoryId。

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

我在尝试在两个表中都创建了外键时发现了这一点,这两个表的列名都是“id”作为主键。

答案 8 :(得分:0)

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

表B: 列a(主键) 专栏b C栏

当您将依赖关系B定义为A时,您将被迫遵守初选定义的顺序。

这意味着你的依赖应该是这样的: 表A表B. 第1栏第b栏 第2栏C栏

AND NOT: 表A表B. 第2栏栏目c 第1栏第b栏

然后这将导致您遇到的错误。

答案 9 :(得分:0)

我找到了另一种方法来解决此错误。如果您尝试在SQL Management Studio的设计视图中创建递归外键(同一表中主键的外键),也会发生这种情况。如果您尚未使用主键保存表,它将返回此消息。只需保存表格,就可以创建外键了。

答案 10 :(得分:0)

如果表中有数据,则可能是问题所在。

在我的情况下,我在下午3点加载的客户表中有一些数据,在下午3:10加载的联系人表中有一些数据,因此联系人表中的某些值不在我的客户表中

我最终从联系表中删除了这些值,然后设法添加了一个键而没有任何问题。