一、背景
SQL Server數據庫中表A中Id字段的定義是:[Id] [int] IDENTITY(1,1),隨著數據的不斷增長,Id值已經接近2147483647(int的取值范圍為:-2 147 483 648 到 2 147 483 647)了,雖然已經對舊數據進行歸檔,但是這個表需要保留最近的1億數據,有什麼方法解決Id值就快爆的問題呢?
解決上面的問題有兩個辦法:一個是修改表結構,把Id的int數據類型修改為bigint;第二個是重置Id(Identity標識列)的值,使它重新增長。
當前標識值:current identity value,用於記錄和保存最後一次系統分配的Id值;下次分配Id就是:當前標識值+標識增量(通常為+1,也可以自行設置);
當前列值:current column value,這Id值到目前為止的最大值;
二、重置過程
(一) 下面就測試重置Identity標識列,首先使用下面的SQL創建測試表:
--創建測試表 CREATE TABLE [dbo].[Test_Identity]( [IdentityId] [int] IDENTITY(1,1) NOT NULL, [Name] [nchar](10) NULL, CONSTRAINT [PK_testid] PRIMARY KEY CLUSTERED ( [IdentityId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
(二) 顯示插入Id值,插入後表[Test_Identity]的記錄如Figure1所示,接著再隱式插入Id值,插入後表[Test_Identity]的記錄如Figure2所示。
--顯示插入Id值 SET IDENTITY_INSERT [Test_Identity] ON INSERT INTO [Test_Identity](IdentityId,Name) SELECT 1000,'name1' SET IDENTITY_INSERT [Test_Identity] OFF --隱式插入Id值 INSERT INTO [Test_Identity](Name) SELECT 'name2'
(Figure1:數據記錄)
(Figure2:數據記錄)
(三) DBCC CHECKIDENT('table_name', NORESEED)不重置當前標識值。DBCC CHECKIDENT 返回一個報表,它指明當前標識值和應有的標識值。執行下面的SQL語句,返回的信息表示:當前標識值'1001',當前列值'1001',如Figure2所示。
--查詢標識值 DBCC CHECKIDENT('Test_Identity', NORESEED) /* 檢查標識信息: 當前標識值'1001',當前列值'1001'。 DBCC 執行完畢。如果DBCC 輸出了錯誤信息,請與系統管理員聯系。 */
(四) 再隱式插入Id值,插入後表[Test_Identity]的記錄如Figure3所示。所以執行上面的SQL語句是不會重置當前標識值的,可以放心執行。
--隱式插入Id值 INSERT INTO [Test_Identity](Name) SELECT 'name3'
(Figure3:數據記錄)
--查詢標識值 DBCC CHECKIDENT('Test_Identity', NORESEED) /* 檢查標識信息: 當前標識值'1002',當前列值'1002'。 DBCC 執行完畢。如果DBCC 輸出了錯誤信息,請與系統管理員聯系。 */