INSERT语句与FOREIGN KEY约束冲突-SQL Server


225

我收到以下错误。请你帮助我好吗?

消息547,级别16,状态0,第1行
INSERT语句与FOREIGN KEY约束“ FK_Sup_Item_Sup_Item_Cat”发生冲突。数据库“ dev_bo”的表“ dbo.Sup_Item_Cat”中发生了冲突。该语句已终止。

码:

insert into sup_item (supplier_id, sup_item_id, name, sup_item_cat_id, 
                      status_code, last_modified_user_id, last_modified_timestamp, client_id)   
values (10162425, 10, 'jaiso', '123123',
        'a', '12', '2010-12-12', '1062425')

最后一列client_id导致错误。我试图将已经存在的值dbo.Sup_Item_Cat放入对应于sup_item的列中。


20
您试图将一条记录插入到您的项目表中,但该表中没有匹配的类别记录Sup_Item_Cat。没什么好说的了。
Martin Smith 2010年

1
那么您是说SELECT * FROM Sup_Item_Cat WHERE sup_item_cat_id = '123123'返回结果吗?
马丁·史密斯

2
您还说:“最后一个库伦“ client_id”我正在发生冲突。” 这不是错误消息所暗示的,我认为您在错误的位置寻找问题。
马丁·史密斯

Answers:


287

在您的表中dbo.Sup_Item_Cat,它具有对另一个表的外键引用。FK的工作方式是它不能在该列中拥有一个值,该值也不能在被引用表的主键列中。

如果您有SQL Server Management Studio,则将其打开并单击sp_helpdbo.Sup_Item_Cat”。查看FK所在的列,以及它引用的表的哪列。您正在插入一些不良数据。

让我知道您是否需要更好的解释!


10
感谢您包含sp_help命令!帮助我缩小了类似问题的范围。
ʀʀʏ2012年

确实-在我的情况下,该属性只是没有从视图发送回控制器,因此它始终为0(这不是有效的ID,但控制器将无法得知。)
neminem

1
Alt + F1是sp_help的快捷方式,对于futrure读者,请选择表格并按alt + f1
satsvelke '19

133

关于试图填充外键字段而收到的错误消息,我自己有这个问题。我最终找到了该页面,希望找到答案。此页面上选中的答案确实是正确的答案,不幸的是,对于不熟悉SQL的人,我认为答案有点不完整。我相当擅长编写代码,但是SQL查询对我以及构建数据库表都是新的。

尽管检查的答案是正确的:

迈克·M写道

“ FK的工作方式是,它不能在该列中拥有一个值,该值也不在被引用表的主键列中。”

简单地说,此答案缺少什么;

您必须先构建包含主键的表。

另一种说法是:

在尝试将数据插入包含外键的子表之前,必须将数据插入包含主键的父表中。

简而言之,许多教程似乎都对这一事实感到困惑,因此,如果您自己尝试并且没有意识到操作顺序,那么您将得到此错误。自然地,在添加主键数据之后,子表中的外键数据必须符合父表中的主键字段,否则,您仍然会收到此错误。

如果有人读了那么远。我希望这有助于使检查的答案更加清晰。我知道有些人可能会觉得这种事情很简单,打开一本书会在发布之前回答这个问题,但事实是并非每个人都以相同的方式学习。


我还要补充一点,请确保对查询进行概要分析,因为它并不总是向数据库发送您认为应该的查询。
HLGEM 2014年

20

您试图在外键表中不存在的外键列中插入具有值的记录。

例如:如果您有“书籍”和“作者”表,其中“书籍”对“作者”表有外键约束,并且您尝试插入没有作者记录的书籍记录。


16

您需要发布您的声明以获得更多说明。但...

该错误意味着您要插入数据的表与另一个表具有外键关系。在插入数据之前,外键字段中的值必须首先存在于另一个表中。


5

从我所见,问题不在于client_id。看起来问题出在第四列sup_item_cat_id

我会跑

sp_helpconstraint sup_item

并注意返回给外键FK_Sup_Item_Sup_Item_Cat的constraint_keys列,以确认哪个列是实际问题,但我很确定这不是您要解决的列。除了“ 123123”外,它也很可疑。


5

我发现所有字段都必须完全匹配。

例如,发送“ cat dog”与发送“ catdog”不同。

我要解决的问题是从要向其中插入数据的表中编写FK代码,注意具有约束的“外键”(在我的情况下为2),并确保这两个字段值匹配完全与引发FK约束错误的表中的状态相同。

一旦解决了我遇到的两个问题,生活就美好了!

如果您需要更好的解释,请告诉我。


这真的帮了我哈哈!忽略了这个事实,解决了我遇到的一个问题!谢谢
Johnathan Brown


3

这就是说的意思。您正在尝试将值插入到具有FK约束的列中,该列与查找表中的任何值都不匹配。


2

仔细检查定义外键的关系中的字段。定义关系时,SQL Server Management Studio可能没有选择您想要的字段。过去这烧死了我。


2
  1. 运行sp_helpconstraint
  2. 支付对外键返回的constraint_keys列的注意

2

父表数据丢失会导致问题。在您的问题中,“ dbo.Sup_Item_Cat”中的数据不可用会导致问题


1

当我使用代码优先迁移为MVC 5应用程序构建数据库时,我遇到了同样的问题。最终,我在configuration.cs文件中发现了种子方法,从而导致了问题。我的种子方法是在使用匹配的主键创建条目之前,为包含外键的表创建一个表条目。


1

当我的插入值字段包含肉眼看不到的制表符和空格时,我遇到了这个问题。我已经在Excel中创建了值列表,将其复制并粘贴到SQL,然后运行查询以查找FK字段中的不匹配项。

匹配查询未检测到我的FK字段中有制表符和空格,但是INSERT识别出它们,并且继续产生错误。

通过将FK字段的内容复制到一条记录中并将其粘贴到插入查询中,我再次进行了测试。当该记录也失败时,我仔细查看了数据并最终检测到选项卡/空格。

清除删除的选项卡/空格后,问题已解决。希望这对某人有帮助!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.