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

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

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

但是,当我试图做到这一点(通过SQL Serverpipe理工作室),我得到了以下错误:

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

我不确定这是什么意思,我想知道是否有任何方法呢?

这意味着tblOne中的主键没有被正确的声明 – 你需要去tblOne并将PRIMARY KEY约束添加回去。

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

如果有一个复合键(你的注释会指出),那么你必须在你的外键引用中同时包含这两列。 请注意,一个表不能有多个主键 – 但是如果它有一个组合键,则会在主键的每个列的旁边看到一个键符号。

如果您有一个复合键,创build一个FK时,顺序是重要的,有时顺序不是如何显示。

我所做的就是转到table1的Keys部分,并select脚本主键作为create to clipboard,然后使用脚本中显示的顺序创buildFK

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

Table1 ColA (PK) ColB (PK) ColC Table2 ID (PK) ColA COLB 

当试图在Table2中创build外键时,我已经按照相反的顺序从combobox中select了值

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

这给我一个像主题名称的错误。 创buildFK保持主键表中列的顺序原样,使错误消失。

愚蠢的,但.. 🙂

如果您在遵循上述所有build议之后仍然出现这个错误,那么一切看起来都是正确的。

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

这个问题引起了我的注意,我把这个关系加在了错误的表格上。 所以如果你想把表A中的关系添加到表B中,试着把表B中的关系添加到表A中。

这个错误发生在我When我试图从PrimaryKey Table开始add foreign key约束

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

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

在MSDN上检查这个链接。 在这里,你有另一个实际案例的链接。

编辑:

回答您的意见,我明白你的意思是主键有2个字段(这使它成为一个组合)。 在SQL中,不可能在同一个表上有两个主键。

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

无论如何,我已经在互联网上调查了一下,似乎SQL Server 2008(像一些以前的版本和其他RDBMS)给你的可能性只引用的主键的一部分,只要这部分是一个候选键(不空和唯一的),你创build一个唯一的约束。

我不确定你是否可以使用它,但查看这个链接了解更多信息。

我发现列名必须匹配。

例如:如果tblOne的id为categoryId,则tblTwo中的引用也必须被称为categoryId。

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

当我试图在两个表名都是“id”的主键之间创build外键时,我注意到了这一点。

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

表B:列a(主键)列b列c

当你将一个依赖关系B定义为A时,那么你就不得不遵守定义初选的顺序。

这意味着您的依赖关系应该如下所示:表A表B列1列b列2列c

而不是:表A表B列2列c列1列b

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

我发现另一种方法来获取此错误。 如果您试图在SQL Management Studio的devise视图中创buildrecursion外键(同一个表中的主键的外键),也会发生这种情况。 如果您还没有使用主键保存表,则会返回此消息。 只需保存表格,就可以创build外键。