如何编写检查以避免消息“INSERT语句与FOREIGN KEY约束冲突”?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何编写检查以避免消息“INSERT语句与FOREIGN KEY约束冲突”?相关的知识,希望对你有一定的参考价值。

我阅读并理解以下问题中的条目:INSERT statement conflicted with the FOREIGN KEY constraint 。我确实明白了,但是,在这种情况下,我需要将大约1 Gb的记录插入到表中,其中一些记录具有冲突的外键。查询如下所示:

IF NOT EXISTS (SELECT * FROM [dbo].[tbl_R_TaskHistory] WHERE [TaskID] = 
10000529)
BEGIN insert into [dbo].[tbl_History] 
([TaskID],[UserID],[ActD],[RequestD],[No],[SignID],[Completed]) 
values (10000529,'A0000187',NULL,5738366,0,NULL,CAST(N'2011-03-16 
04:53:37.210' AS DateTime)) END 

在RequestID上发生冲突,所以我认为必须有一种方法来检查以避免错误消息。我的观点是,我希望我的查询检查RequestID是否没有FOREIGN KEY约束,它不会插入此记录并移动到下一个记录。

答案

如果您的查询只包含一行,您可以像这样展开检查:

IF NOT EXISTS (SELECT * FROM [dbo].[tbl_R_TaskHistory] WHERE [TaskID] = 10000529) AND EXISTS(SELECT 1 FROM [dbo].[...referencing table...] WHERE [RequestD] = 5738366)
BEGIN 
    insert into [dbo].[tbl_History] ([TaskID],[UserID],[ActD],[RequestD],[No],[SignID],[Completed]) 
    values (10000529,'A0000187',NULL,5738366,0,NULL,CAST(N'2011-03-16 04:53:37.210' AS DateTime));
END 

无论如何,如果要同时插入多行并出于性能考虑,最好将值存储在缓冲区表中。像这样的东西:

insert into #tbl_History ([TaskID],[UserID],[ActD],[RequestD],[No],[SignID],[Completed]) 
values (10000529,'A0000187',NULL,5738366,0,NULL,CAST(N'2011-03-16 04:53:37.210' AS DateTime)) 
      ,(...)
      ,(...)
      ,(...)

然后,只需对引用表执行内连接:

insert into [dbo].[tbl_History] ([TaskID],[UserID],[ActD],[RequestD],[No],[SignID],[Completed]) 
SELECT [TaskID],[UserID],[ActD],[RequestD],[No],[SignID],[Completed]
FROM #tbl_History A
INNER JOIN [dbo].[...referencing table...] B
    ON A.[RequestD] = B.[RequestD];
另一答案

这种语法也有效

declare @a int = 5;
declare @b int = 18;

insert into sample (a, b) 
select @a, @b  
where not exists (select 1 from sample where b = @b)
  and     exists (select 1 from student where iden = @a)

这避免了创建#temp

insert into sample (a, b) 
select a, b 
from ( values (5,19)
            , (5,30)
            , (5,31)
            , (5,32)
            , (7,41)
            , (7,42)
     ) v(a,b)  
where not exists (select 1 from sample where b = v.b)
  and     exists (select 1 from student where iden = v.a)

以上是关于如何编写检查以避免消息“INSERT语句与FOREIGN KEY约束冲突”?的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何检查应用程序是不是已被带到后台以避免不需要的 BroadcastReceiver 检查

如果未登录,如何制作过滤器以避免访问页面?

如何检查数组元素是不是为空以避免Java中的NullPointerException

当您连接 2 个具有相同架构的表并检查除一个以外的所有字段是不是相等时,如何避免在 SQL 中编写冗长的 where 子句?

如何避免两次编写 SQL Server 查询以避免重复?

如何编写代码以避免'tensorflow'没有属性'Session'和'global_variables_initializer'的错误