Sql-Server

如何重置表的所有標識值,並在 Sql Server 2008 中重新設置自動編號

  • January 9, 2018

我有一個客戶在數據庫中有一個帶有自動編號 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 行的異常,那麼今天祝你好運。正如我在評論中所建議的那樣,也許您不應該將這些明顯-否則-絕對-毫無意義的代理標識符暴露給使用者。

引用自:https://dba.stackexchange.com/questions/28622