我需要对一个 SQL Server 2008 数据库进行一些更改。
这需要创建一个新表,并在新表中插入一个外键,引用已经存在的表的主键。所以我想在我的新 tblTwo 和 tblOne 的主键之间建立关系。
然而,当我尝试通过 SQL Server 管理工具来实现时,出现了以下错误:
表 'tblOne' 中的列没有匹配到现有的主键或唯一性约束
我不太确定这是什么意思,想知道是否有任何解决方法?
我需要对一个 SQL Server 2008 数据库进行一些更改。
这需要创建一个新表,并在新表中插入一个外键,引用已经存在的表的主键。所以我想在我的新 tblTwo 和 tblOne 的主键之间建立关系。
然而,当我尝试通过 SQL Server 管理工具来实现时,出现了以下错误:
表 'tblOne' 中的列没有匹配到现有的主键或唯一性约束
我不太确定这是什么意思,想知道是否有任何解决方法?
这意味着tblOne中的主键未被正确声明 - 您需要转到tblOne并将PRIMARY KEY约束添加回去。
如果您确定tblOne确实有PRIMARY KEY约束,则可能在您的数据库中有多个属于不同模式的tblOne表,而您的FK约束中的引用子句正在选择错误的表。
如果有复合键(您的评论会指示出这一点),则您还必须在外键引用中包括两个列。请注意,表不能具有多个主键 - 但是,如果它具有复合键,则您将在每个列旁边看到一个键符号,该列是主键的一部分。
我曾经遇到过一种情况,导致我涉足了这个话题。虽然错误相同,但原因不同。也许会对某些人有所帮助。
Table1
ColA (PK)
ColB (PK)
ColC
Table2
ID (PK)
ColA
COLB
Table1.ColB = Table2.ColB
Table1.ColA = Table2.ColA
这个问题的错误提示与主题名称相同。将外键创建时保持列的顺序与主键表中的顺序一致,可以使错误消失。
有些愚蠢,但是有效 :)
当我尝试从主键表开始添加外键约束时,出现了这个错误。
只需前往其他表并从那里创建此外键约束(外键表)。
这个问题让我困扰了一段时间,原来是我在错误的表格上添加了关系。所以如果你想在表格A中添加到表格B的关系,请尝试在表格B中添加从表格A到表格B的关系。
_tblname, primary key name, foreign key_
tblOne, "categoryId", none
tblTwo, "exampleId", "categoryId"
我注意到当我尝试在两个表之间创建外键时,它们都将" id "列作为主键。
如果您的表中有数据,这可能是问题所在。
在我的情况下,我在下午3点加载了一些帐户表中的数据,以及在下午3:10分加载了一些联系人表中的数据,因此联系人表中有一些尚未出现在我的帐户表中的值。
最终,我删除了联系人表中的这些值,然后成功添加了一个键而没有遇到任何问题。
看起来你正在尝试在tblTwo中创建一个外键,但它与tblOne中的任何主键或唯一索引不匹配(或没有参与匹配)。
编辑:
回答您的评论,我理解您的意思是主键中有2个字段(使其成为复合键)。在SQL中,不可能在同一表中拥有两个主键。
在我看来,外键字段应始终引用所引用表中的单个记录(即在您的情况下是整个主键)。这意味着在创建外键之前,您需要将tblOne主键的两个字段放入tblTwo中。
无论如何,我在互联网上进行了一些调查,似乎SQL Server 2008(以及某些之前版本和其他RDBMS)可以提供仅引用主键的部分的可能性,只要此部分是候选键(非空和唯一),并且您在其上创建唯一约束。
我不确定您是否可以在您的情况下使用它,但请查看此link以获取更多信息。
NOT NULL
不是必需的,不需要成为PK的一部分等),这是标准SQL的一个特性,不仅限于SQL Server 2008版本,正如评论中所确认的(包括你自己的评论! :) - onedaywhen