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语句是否会成功?它似乎,但不确定它是运气还是保证。
答案 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语句作为单个事务运行,因此它应该可以工作。它不是运气!!