【问题标题】:How to write a check to avoid the message "INSERT statement conflicted with the FOREIGN KEY constraint"?如何编写检查以避免消息“INSERT 语句与 FOREIGN KEY 约束冲突”?
【发布时间】:2018-03-01 07:31:38
【问题描述】:

我阅读并理解了以下问题中的条目: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 约束,它不会插入此记录并移至下一个记录。

【问题讨论】:

标签: sql sql-server tsql foreign-keys sql-insert


【解决方案1】:

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

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];

【讨论】:

    【解决方案2】:

    这种语法也有效

    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)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 2021-05-30
    相关资源
    最近更新 更多