咱們常常使用SQL Server的ID自增加,也就是所謂的標識列來充當某張表的主鍵。這裏有兩個概念要澄清:sql
1. 標識列:可用 IDENTITY 屬性創建,使應用程序開發人員得以對錶中所插入的第一行指定標識數字(Identity Seed 屬性),並肯定要添加到種子上的增量(Identity Increment 屬性)以決定後面的標識數字。在向具備標識符列的表中插入值時,經過遞增種子值的方法自動生成下一個標識值。ide
2. 主鍵:可用primary key表示。惟一標識表中的全部行的一個列或一組列。主鍵不容許空值。不能存在具備相同的主鍵值的兩個行,所以主鍵值老是惟一標識單個行。 測試
那麼,當咱們表中的數據不少,又有些刪除的操做時,標識列就不連貫了,咱們如何讓表中已有記錄的標識列從1開始從新排列,並將標識列的下一個值設爲記錄數加1呢?下面咱們以一張student(id identity(1,1) primary key,name,age)表爲例。spa
(1) 清空表,標識種子置初值,這裏要注意的是下面的語句會清空表中的全部原有數據。
code
truncate table student
(2) 先要取消標識列,完成下面的語句後再將標識列加上,這樣標識列又能夠按順序遞增了。這裏你能夠直接使用企業管理器操做。orm
declare @i int select @i = 0 update student set @i = @i+1,id = @i
(3) 利用臨時表,步驟就是將表中除id之外的數據拷貝到臨時表中,再清空原表,插入臨時表的數據,最後刪除臨時表。開發
--將數據倒入臨時表rem
select name,age into # from student order by id
--清空源表,它同時會重置標識列it
truncate table student
--將數據導回源表table
insert into student select * from #
--刪除臨時表
drop table #
在插入測試數據的時候一條一條記錄的插入,這樣太浪費時間,咱們能夠寫一條循環語句加快測試速度:
declare @i int set @i=1 while @i<=100 begin insert into student values ('tbag'+cast(@i as varchar) ,25+@i) set @i=@i+1 end