将多行插入到引用自身的表中

时间:2018-01-23 06:42:13

标签: tsql

e.g。

create table dbo.fktest (
id int not null primary key, 
val varchar(100) not null, 
idparent int null)    

alter table dbo.fktest add constraint FK_fktest foreign key (idparent) references fktest(id)    
go
-- one row references another row, which isn't in the table at the start of the insert command.
insert dbo.fktest values (2, 'two', 1), (1, 'one', null)

最后的insert语句是否会成功?它似乎,但不确定它是运气还是保证。

2 个答案:

答案 0 :(得分:2)

根据经验,似乎以下INSERT陈述实际上是单一陈述:

insert dbo.fktest values (2, 'two', 1), (1, 'one', null)

证据是,如果插入失败,整个语句将被回滚。另外,正如@Zohar在上面评论的那样,我们可以在上面的插入中设置一个触发器,它只会触发一次。

因此,插入所有记录后,插入只需要传递约束检查。这意味着顺序无关紧要,至少在约束方面如此。也就是说,以下两个插入语句都是有效的:

insert dbo.fktest values (2, 'two', 1), (1, 'one', null);
insert dbo.fktest values (1, 'one', null), (2, 'two', 1);

答案 1 :(得分:0)

最好为fkey插入所有空值,然后将fkey更新为你想要它引用的内容。

insert into语句作为单个事务运行,因此它应该可以工作。它不是运气!!