使用IDENTITY資料行發生跳號的可能狀況

使用IDENTITY資料行發生跳號的可能狀況

問題描述

在論壇上看到有網友討論到使用IDENTITY資料行,在沒有刪除資料的狀況下發生跳號,發生這樣的原因有可能是因為ROLLBACK所導致,下一節就針對上述狀況做一點實驗,來重現這個問題。

實驗步驟

透過下列T-SQL指令碼,在建立資料表之後先新增10筆資料。

use tempdb
go
if exists (select * from sys.tables where name = 't1')
    drop table t1
go

create table t1
(c1 int identity,c2 varchar(10))
go

--第一次新增10筆資料
insert into t1(c2) values ('test')
go 10

dbcc checkident('t1')

透過DBCC CHECKIDENT可以看到目前流水號已經來到第10號。

image

接著再新增3筆資料之後故意ROLLBACK。

 

--新增3筆資料然後故意Rollback
begin tran
insert into t1(c2) values ('test')
go 3
rollback tran
go

--已經造成跳號了,下一筆序號會從14號開始
dbcc checkident('t1')

由下圖可知,目前流水號已經是13號。

image

所以當您在新增資料時,會從14號開始。

image

參考資料

各位遇到过identity跳号的情况没有?

Identity column not getting sequential values

DBCC CHECKIDENT