如果约束失败,则插入值或忽略行

时间:2011-11-16 12:14:08

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

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

E.g。我有一个与此类似的插入语句:

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

parent_id是另一个表的fk。那我怎样才能让sql server跳过fk列无效的行?

更新我希望自动生成此功能,而无需先过滤掉那些违反fk约束的行。原因是因为insert语句是由程序生成的,所以事先不知道每个表上存在哪些外键。

2 个答案:

答案 0 :(得分:2)

您到达那里是一种奇怪的情况,但您可以将值插入临时表,然后仅选择具有有效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 :(得分:1)

一种方法是在插入和更新上使用而不是触发器。然后,您可以在实际写入DB之前评估要更新的每一行。我通常不是触发器的忠实粉丝,但你似乎有一个不寻常的要求。