2011-11-16 37 views
2

在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约束的行。原因是因为插入语句是由程序生成的,所以事先并不知道每个表上存在哪些外键。

回答

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 
+0

+1 INNER JOIN to parentTable on id可能稍微更优化。不过这是一个很好的解决方案。 – brian

+0

@brian我编辑了答案以反映您的优化 – dcarneiro

1

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