我需要对SQL Server 2008数据库进行一些更改。
这需要创建一个新表,并在新表中插入一个引用现有表的主键的外键。所以我想在我的新tblTwo之间建立一个关系,它引用了tblOne的主键。
但是,当我尝试这样做时(通过SQL Server Management Studio),我收到以下错误:
表'tblOne'中的列没有 匹配现有的主键或 UNIQUE约束
我不确定这意味着什么,我想知道它是否有任何解决方法?
答案 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加载的联系人表中有一些数据,因此联系人表中的某些值不在我的客户表中
我最终从联系表中删除了这些值,然后设法添加了一个键而没有任何问题。