2009-02-21 36 views
1

我有一個主鍵爲bigint的表(標識屬性爲是,並從1開始)。此表正在製作中,並且已在每日更新基礎上進行更新:大量刪除和插入。重置主鍵(int作爲標識)

問題是這個鍵現在變得太大,現在有8位數字。我最終擔心有一天會溢出。

幸運的是,這個鍵不能用作任何其他表的外鍵。它只是用來識別表格中的一行。因此,我可以重新安全地重置從1開始的鍵值,也許每年一次。

我可以創建一個空白表並將其他字段數據複製到那裏,然後刪除原始表中的所有行,重置鍵/表並最終將數據複製回來。

不確定是否存在Microsoft SQL 2005中可用的內置sp_xxx來執行該任務:僅從1開始按順序重置主鍵而不影響其他列數據?或者其他簡單的解決方案?

回答

8

bigint的最大值是9,223,372,036,854,775,807。如果你一天得到8位數字,你仍然需要10天才能達到最大值。這就像2500萬年。

假設你仍然想重置列,我所擁有的第一個問題是:行的排序是否重要?這意味着你是否依靠1000行之前排在1000之前的事實,比如按時間順序排列或其他絕對排序?如果沒有,很容易:刪除列再次添加。嘿presto,新的價值觀。

如果你需要維持秩序,您需要多一點認真做到這一點:

  1. 鎖表;
  2. 更改類型,使其不再自動增加;
  3. 創建一個新列。你最好現在沒有索引,因爲更新索引會減慢插入;
  4. 在第二個循環中填充一個循環,用於增加一個計數器(如SQL Server rownum技巧),以使插入與原始順序相匹配;
  5. 用新的替換舊列;
  6. 重置自動增量和主鍵狀態。
0

如果您使用的是BIGINT,那麼您甚至不會將其溢出。如果一年後你只有1000萬,那麼你可以走一百萬年,但仍然可以。

2

用不同的名稱創建一個新表,但列完全相同。從old_table中插入new_table select。然後刪除舊錶並重命名新表。