如何查詢SQL Server 自增ID值不連續記錄

2022-04-29 09:42:11 字數 2709 閱讀 5434

(面試遇到的乙個問題,沒有寫出來,回來查詢後在此做個記錄)

在很多的時候,我們會在資料庫的表中設定乙個字段:id,這個id是乙個identity,也就是說這是乙個自增id。當併發量很大並且這個字段不是主鍵的時候,就有可能會讓這個值重複;或者在某些情況(例如插入資料的時候出錯,或者是使用者使用了delete刪除了記錄)下會讓id值不是連續的,比如1,2,3,5,6,7,10,那麼在中間就斷了幾個資料,那麼我們希望能在資料中找出這些相關的記錄,我希望找出的記錄是3,5,7,10,通過這些記錄可以檢視這些記錄的規律來分析或者統計;又或者我需要知道那些id值是沒有的:4,8,9。

執行下面的語句生成測試表和測試記錄

--生成測試資料

ifexists

(select

*from

sysobjects 

where

id =

object_id('

[t_idnotcontinuous]') 

andobjectproperty

(id, 

'isusertable') 

=1) drop

table

[t_idnotcontinuous

]create

table

[t_idnotcontinuous](

[id][

int]

identity(1

, 1)  not

null,[

valuesstring][

nchar](

10) 

null

)set

identity_insert

[t_idnotcontinuous]on

insert

[t_idnotcontinuous](

[id],

[valuesstring]) 

values( 1

,'test')

insert

[t_idnotcontinuous](

[id],

[valuesstring]) 

values( 2

,'test')

insert

[t_idnotcontinuous](

[id],

[valuesstring]) 

values( 3

,'test')

insert

[t_idnotcontinuous](

[id],

[valuesstring]) 

values( 5

,'test')

insert

[t_idnotcontinuous](

[id],

[valuesstring]) 

values( 6

,'test')

insert

[t_idnotcontinuous](

[id],

[valuesstring]) 

values( 7

,'test')

insert

[t_idnotcontinuous](

[id],

[valuesstring]) 

values

( 10,'

test')

setidentity_insert

[t_idnotcontinuous

]off

select

*from

[t_idnotcontinuous

](圖1:測試表)

--拿到當前記錄的下乙個記錄進行連線

select

id,new_id

into

[t_idnotcontinuous_temp

]from

(select

id,new_id =(

select

top1

id from

[t_idnotcontinuous

]whereid=

(select

min(id) 

from

[t_idnotcontinuous

]where

id>

a.id)

)from

[t_idnotcontinuous]as

a) asb

select

*from

[t_idnotcontinuous_temp

](圖2:錯位記錄)

--不連續的前前後後記錄

select

*from

[t_idnotcontinuous_temp

]where

id <>

new_id -1

--查詢原始記錄

selecta.*

from

[t_idnotcontinuous]as

ainner

join

(select

*from

[t_idnotcontinuous_temp

]where

id <>

new_id -1

) asbon

a.id 

>=

b.id 

anda.id 

<=

b.new_id

order

bya.id

(圖3:效果)

SQL Server 如何設定ID自增

對於已經建好的資料表,是不能在sql server management中進行視覺化的修改id為自增長,必須通過命令列來實現。自增列不能直接修改,必須將原有id列刪除,然後重新新增一列具有identity屬性的id欄位。比如你要修改的欄位名為id alter table 表名 drop column...

sql server 重置自增

delete tb where id 100 dbcc checkident tb reseed,1 dbcc checkident tb reseed 其結果將 tb 表的自增種子設定為當前表裡標識列的最大值 再次增加資料就會繼續那個數字了 實測 建立測試環境 if object id tb is...

SQL Server 如何設定某列自增

對於已經建好的資料庫表,可以採用兩種方法來修改 若還有疑問可以看看最後的備註 1 通過sql server management studio修改 我使用的是2012版的 選擇資料庫表右鍵 設計表 點一下你要修改的列 在下方看到列屬性 將標識規範點開 在 是標識 那選擇是就改好了 完成以後如下所示 ...