Sql-Server
如何重置表的所有標識值,並在 Sql Server 2008 中重新設置自動編號
我有一個客戶在數據庫中有一個帶有自動編號 id 欄位的表。客戶使用該 id 作為儲存在數據庫中的唯一記錄的使用者友好標識符。一段時間後,我的應用程序將刪除數據庫中的舊記錄,這樣在任何給定時間通常都會有大約 30k 條記錄的滑動視窗。
這個功能很好,已經工作了幾年,但是現在數據庫中的 id 已經上億了,客戶現在很難將故障 id 傳達給外界。
他們想要做的,我希望知道怎麼做,是把目前表中的所有記錄,減少他們的 id 從 1 開始,然後重新設置身份以開始計算新的身份證是。
在數學中:新 id = 目前 id - min(ID)
最後:新種子 = max(id)
謝謝
編輯
為了幫助澄清一件事,記錄會定期從數據庫中刪除,因此開始:
1-30k 有效記錄
5個月後:
1-2mil - 無記錄 2mil - 2mil + 30k - 有效記錄
使用者本質上想要做的是從所有 id 中減去 200 萬(仍然是唯一的),並假裝以前的記錄根本不存在。
最簡單的方法是創建一個新表。注入要保留的 30,000 行,然後刪除舊表並重命名新表。
BEGIN TRANSACTION; CREATE TABLE dbo.copy_of_foo ( ID INT IDENTITY(1,1) PRIMARY KEY, col2 ..., ... ); INSERT dbo.copy_of_foo(col2, ...) SELECT TOP 30000 col2, ... FROM dbo.foo ORDER BY ...; DROP TABLE dbo.foo; EXEC sp_rename N'dbo.copy_of_foo', N'foo', N'OBJECT'; COMMIT TRANSACTION;
OPTION (MAXDOP 1)
如果您想確保獲得最新的 30K 行,並且 IDENTITY 值按從最舊到最新的順序分配,則可能需要嵌套 order by 並添加,例如,希望您有其他列,例如日期時間列,這可以幫助辨識您要保留的 30000 行:INSERT dbo.copy_of_foo(col2, ...) SELECT col2, ... FROM ( SELECT TOP 30000 col2, ... FROM dbo.foo ORDER BY date_time_column DESC ) AS x ORDER BY date_time_column OPTION (MAXDOP 1);
但請記住,如果有人昨天報告了第 42,000,564 行的異常,那麼今天祝你好運。正如我在評論中所建議的那樣,也許您不應該將這些明顯-否則-絕對-毫無意義的代理標識符暴露給使用者。