例如
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
语句实际上是单个语句:
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);
关于t-sql - 将多行插入到引用自身的表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48395652/