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

标签 t-sql

例如

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/

相关文章:

sql - 尝试使用计算列将 "yy/mm/dd hh:mm:ss"(存储为字符)转换为日期时间

sql - 我应该拆分 SQL Server 表吗?

sql - T-SQL 中的分区排名

t-sql - View 中的一对多 SELECT 语句

sql-server - 将 XML 输出转换为 varchar

sql-server - 如何减少SQL查询执行时间

t-sql - 左连接没有达到我的预期

t-sql - 根据函数规范排除 where 子句

sql-server - 使用异常语法的 SQL UPDATE

sql server 更新查询失败