多行插入的“批量自动递增” ID

时间:2019-02-18 15:48:49

标签: sql sql-server sql-insert auto-increment

我正在使用SQL Server 2017,并且具有以下形式的表:

tbl_current

COL1   COL2
-----------
 A      1
 B      3
 C     56

我想定期将其插入表tbl_release中。

此表将有一个额外的ID列,我想随着每个“批处理插入”自动递增。例如,假设我执行了tbl_currenttbl_release的摄取,它看起来像这样:

tbl_release

ID   COL1   COL2
----------------
 1    A       1
 1    B       3
 1    C      56 

现在,假设我使用相同的数据执行另一次提取,如下所示:

tbl_release

ID   COL1   COL2
----------------
 1    A       1
 1    B       3
 1    C      56 
 2    A       1
 2    B       3
 2    C      56  

实现此目标的最佳方法是什么?是否有一些SQL Server功能可以实现此目的,还是我需要运行一些子查询?

3 个答案:

答案 0 :(得分:4)

我个人会使用一个序列。假设已插入临时表,看起来像这样:

declare @ID int = next value for sequence dbo.mySequence;

insert into tbl_release
   (ID, col1, col2)
select @ID, col1, col2
from tbl_current;

答案 1 :(得分:0)

您可以使用MAX()函数尝试此操作,如下所示。

Declare @maxId int
set @maxId = (Select isnull(id, 0) from tbl_Current)
set @maxId = @maxId + 1
--Now to insert
insert into tbl_release values (@maxId, <Column1Value>, <Column2Value>)

对于多次插入,您可以尝试

INSERT INTO tbl_release
SELECT @maxId, col1, col2 FROM tbl_Current

如果表的ID列是标识,则还可以使用Scope_Identity获取ID列的最大值。

答案 2 :(得分:0)

您的create table batches ( batch_id int identity(1, 1) primary key, batch_start_date datetime, . . . ); 实际上是一个对象。我强烈建议您提供完整的表格:

create table releases (
    release_id int identity(1, 1) primary key,
    batch_id int not null references batches(batch_id),
    col1 char(1),
    col2 int
);

然后,您现有的表的结构应为:

<h1 mat-dialog-title>Where do you work?</h1>
<div mat-dialog-content>
  <mat-form-field>
    <input matInput placeholder="enter work location" autocorrect="off" autocapitalize="off" spellcheck="off" type="text" class="form-control" #search [formControl]="searchControl">
    <agm-map id="capture-work-map" [latitude]="coordinates.lat" [longitude]="coordinates.lng" [zoom]="zoom">
      <agm-marker [markerDraggable]="true" [latitude]="coordinates.lat" [longitude]="coordinates.lng"></agm-marker>
    </agm-map>
  </mat-form-field>
</div>
<div mat-dialog-actions>
  <button mat-button (click)="onNoClick()">Cancel</button>
  <button mat-button [mat-dialog-close]="coordinates" cdkFocusInitial>Update</button>
</div>

这样,您的数据库就具有参照完整性。