SQL Server 2005 - 關於 IDENTITY 的小技巧

SQL Server 2005 - 關於 IDENTITY 的小技巧

最近,備份資料庫遇到一個問題,就是將舊資料搬移到新主機資料表的時候,如果主鍵是的 IDENTITY 是設定自動增加的話,那麼舊有的主鍵資料,在新資料表上面就好像是重新編號一樣又從第 1 筆開始塞到第 N 筆。

( PS. 我不是專業的 DBA 或是 DBD,所以我只會很笨的方法。)

例如 : 

某台主機上舊有資料如下,C1 欄位是自動編號,但是可能經過使用者動作,可能只剩下 1、3、4、7、11 這幾筆。

IDENTITY-0000

塞到新資料表,C1 欄位就變成 1、2、3、4、5 完全走樣了。

IDENTITY-0001

後來發現原來要設定 IDENTITY_INSERT 的選項,才有辦法自己設定自動編號的欄位值。

語法如下:

-- 開啟 TestTable 的 IDENTITY_INSERT 屬性
SET IDENTITY_INSERT TestTable ON 
 
-- 關閉 TestTable 的 IDENTITY_INSERT 屬性
SET IDENTITY_INSERT [TestTable] OFF 

 

如果要重設資料表的 IDENTITY 的編號的話,則要使用 DBCC CHECKIDENT 指令來設定,以下為操作範例:

   1:  -- 將資料表資料刪除, 並重設 IDENTITY 
   2:  TRUNCATE TABLE [TestTable]
   3:   
   4:  -- 開啟資料表可自行輸入 IDENTITY 的功能 
   5:  SET IDENTITY_INSERT [TestTable] ON 
   6:   
   7:  -- 準備資料來源
   8:  CREATE TABLE #tt (C1 int, C2 nvarchar(50) ,C3 nvarchar(50))
   9:  INSERT INTO #tt (C1, C2, C3) VALUES (1, '1', '2' )
  10:  INSERT INTO #tt (C1, C2, C3) VALUES (3, '2', '4' )
  11:  INSERT INTO #tt (C1, C2, C3) VALUES (4, '3', '6' )
  12:  INSERT INTO #tt (C1, C2, C3) VALUES (7, '4', '8' )
  13:  INSERT INTO #tt (C1, C2, C3) VALUES (11, '5', '10' )
  14:   
  15:  -- 將資料來源塞入目的資料表
  16:  INSERT INTO [TestTable] (C1, C2, C3) 
  17:  SELECT * FROM #tt 
  18:   
  19:  Drop table #tt
  20:   
  21:  -- 關閉資料表可自行輸入 IDENTITY 的功能, 由系統自行指定
  22:  SET IDENTITY_INSERT [TestTable] ON 
  23:   
  24:  -- 將資料表的 IDENTITY 設為 11 (下一筆資料為 12)
  25:  DBCC CHECKIDENT (TestTable, reseed, 11)
  26:  DBCC CHECKIDENT (TestTable, reseed)

 

用以上語法產生新的 TestTable 就跟舊有的資料表一模一樣囉。

IDENTITY-0000