插入后的 T-SQL 增量 ID

Posted

技术标签:

【中文标题】插入后的 T-SQL 增量 ID【英文标题】:T-SQL Increment Id after Insert 【发布时间】:2017-04-20 12:21:36 【问题描述】:

我目前正在使用 T-SQL 在 SQL Server 2012 中处理存储过程。我的问题:我有几个 SWOT(例如,针对特定客户)持有几个 SWOTPart(优势、劣势、机会和威胁)。我将值存储在一个表 Swot 以及另一个表 SwotPart 中。 我的外键链接是 SwotPart 中的 SwotId,因此 1 个 Swot 可以容纳 N 个 SwotPart。因此,我将 SwotId 存储在每个 SwotPart 中。 我可以有很多 Swot,现在需要正确设置 SwotId 来创建外键。我使用 SCOPE_IDENTITY() 设置 SwotId 不幸的是,它只需要数据库中的最后一个 SwotId。我正在寻找类似 for 循环的东西,以便在第一次插入后每次插入后递增 SwotId。

DECLARE @SwotId INT = 1;    

-- 1st insert
SET NOCOUNT ON
INSERT INTO [MySchema].[SWOT]([SwotTypeId]) // Type can be e.g. a sepcific client
SELECT SwotTypeId
FROM @SWOTS

SET @SwotId = SCOPE_IDENTITY(); // currently e.g. 7, but should increment: 1, 2, 3...

-- 2nd insert
SET NOCOUNT ON
INSERT INTO [MySchema].[SwotPart]([SwotId], [FieldTypeId], [Label]) // FieldType can be e.g. Streangh
SELECT @SwotId, FieldTypeId, Label
FROM @SWOTPARTS

你知道如何解决这个问题吗?我可以用什么来代替SCOPE_IDENTITY()

非常感谢!

【问题讨论】:

当你想插入多个@swots@swotparts时你怎么知道哪个@swotparts去哪个@swots 我看不到您对Swot 表的插入查询,其 id 将用作SwotPart 表中的外键。您不能在外键列中放置任意值。如果我错了,请纠正我。 ***.com/questions/34826450/… 【参考方案1】:

您可以将outputinserted 行添加到临时表中,然后根据自然键将@swotparts 加入到临时表中(无论SwotId 之外的任何唯一列集将它们联系在一起)。这将解决使用循环或游标的问题,同时也克服了一次执行单个swot 的障碍。

set nocount, xact_abort on;

create table #swot (SwotId int, SwotTypeId int);

insert into MySchema.swot (SwotTypeId) 
  output inserted.SwotId, inserted.SwotTypeId into #swot
select SwotTypeId
from @swots;

insert into MySchema.SwotPart(SwotId, FieldTypeId, Label)
select s.SwotId, p.FieldTypeId, p.Label
from @swotparts p
  inner join #swot s
    on p.SwotTypeId = p.SwotTypeId;

【讨论】:

谢谢,就像一个魅力!临时表的解决方案是我想要存储 Id @TimHorton 乐于助人!【参考方案2】:

很遗憾,我无法发表评论,所以我会给你一个答案,希望能澄清一些事情:

由于您需要创建正确的外键,我不明白 为什么你需要增加一个值而不是使用插入的 id 进入 SWOT 表。

我建议在插入语句之后使用 SCOPE_IDENTITY 返回插入的 id,并将其用于插入到 swot 部分(关于它以及如何使用它的信息很多)

 DECLARE @SwotId INT;    
-- 1st insert
INSERT INTO [MySchema].[SWOT]([SwotTypeId]) // Type can be e.g. a sepcific client
SET @SwotId = SCOPE_IDENTITY();

-- 2nd insert
INSERT INTO [MySchema].[SwotPart]([SwotId], [FieldTypeId], [Label])
SELECT @SwotId, FieldTypeId, Label
FROM @SWOTPARTS

【讨论】:

感谢您的帮助

以上是关于插入后的 T-SQL 增量 ID的主要内容,如果未能解决你的问题,请参考以下文章

MySQL插入,如何从插入中获取增量ID [重复]

MySQL 多行插入是不是获取顺序自动增量 ID?

postgres 自动增量未在显式 id 插入时更新

带有Python的Mysql无法插入具有自动增量ID的记录,为啥?

Laravel:在具有自动增量ID的字段上插入随机ID

在使用准备好的语句执行插入查询后获取自动增量 ID