【问题标题】:Insert values or ignore row if a constraint fails如果约束失败,插入值或忽略行
【发布时间】:2011-11-16 12:14:08
【问题描述】:

在 SQL Server 2008 中,有没有办法在插入行的同时省略那些导致外键约束失败的行?

例如我有一个类似这样的插入语句:

insert into tblFoo(id, name, parent_id, desc) values 
(1, 'a', 1, null),
(2, 'c', 3, 'blah'),
....;

parent_id 是另一个表的 fk。然后如何让 sql server 跳过 fk 列无效的行?

更新我想让它自动工作,而不必先过滤掉那些违反 fk 约束的行。原因是插入语句是由程序生成的,因此事先不知道每个表上存在哪些外键。

【问题讨论】:

    标签: sql sql-server foreign-keys bulkinsert batch-insert


    【解决方案1】:

    您遇到的情况很奇怪,但您可以将值插入临时表,然后仅选择具有有效 FK 的值。

    类似:

    declare @tempTable table (
        id int, 
        name nvarchar(50) ,
        parent_id int ,
        [desc] nvarchar(50) 
    )
    
    insert into @tempTable values
    (1, 'a', 1, null),
    (2, 'c', 3, 'blah')
    
    insert into tblFoo(id, name, parent_id, [desc])
    select tempTable.* from @tempTable as tempTable
    inner join parent_id on parent_id.id = tempTable.parent_id
    

    【讨论】:

    • +1 INNER JOIN to parentTable on id 可能稍微更优一些。不过,这是一个很好的解决方案。
    【解决方案2】:

    一种方法是在插入和更新上使用 Instead Of 触发器。然后,您可以在实际写入数据库之前评估正在更新的每一行。我通常不是触发器的忠实拥护者,但您似乎在这里有一个不寻常的要求。

    【讨论】:

      猜你喜欢
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      相关资源
      最近更新 更多