web-dev-qa-db-ja.com

SQLServerの自動インクリメント主キーの上限

SQL Serverの自動インクリメント主キーの上限は何ですか? SQL Serverの自動インクリメント主キーが上限に達するとどうなりますか?

35
Dema

Joelの答えは正解です。これは、使用するデータ型の上限です。

そのうちの2つの例を次に示します。

  • int:2 ^ 31-1(2,147,483,647)
  • bigint:2 ^ 63-1(9,223,372,036,854,775,807)

私は実際に働いていた仕事で限界に達しました。実際のエラーは次のとおりです。

メッセージ8115、レベル16、状態1、行1 
 IDENTITYをデータ型intに変換する算術オーバーフローエラー。
算術オーバーフローが発生しました。

これにはいくつかの修正があり、頭のてっぺんから考えることができます。 1番はおそらく非常に難しく、可能性は低いです。2番は簡単ですが、コードベースに問題が発生する可能性があります。

  1. ID列が重要ではない場合(外部キーなどではない場合)、データベースを再シードしてID列をリセットできます。
  2. ID列をより大きな番号に変更します。したがって、たとえば、intをオーバーフローさせた場合は、ID列を大きなintに変更します。それをあふれさせる幸運:)

おそらく他の修正もありますが、簡単な魔法の弾丸はありません。関係の中心であるテーブルではこれが起こらないことを願っています。これは難しい修正ではなく、退屈で長い修正です。

38
CubanX

データ型によって異なります。 bigintを使用する場合、オーバーフローする可能性はほとんどありません。通常のintでも、数十億行になります。あふれたことは一度もないので、あふれたらどうなるかわかりません。

4
Joel Coehoorn

どうなるか教えてあげます...私のデータはその特定のテーブルへの挿入を停止しました。データベースはまだ機能していますが、データが欠落していて一貫性がないことがわかりました。少し調べてみると、エラーテーブルが見つかり、手動で挿入しました。エラーは上記と同じです。

列をBIGINTに変更する必要がありました。やや遅いサーバー上の26GBデータベースでは、約30分かかりました。データベースのアーカイブバージョン(150GB程度)では、かなり時間がかかりました。

幸いにも、このテーブルの関係はそれほど多くないので、痛みはごくわずかでした。

2
David M

DBCC CHECKIDENT(SomeTable、RESEED、1)

これにより、テーブル 'SomeTable'のIDが1にリセットされます。

これがこれを行うための最良の方法であるかどうかはわかりません。

1
Nick Wright

データ型の説明:

BIGINT    Integer data from -2^63 through 2^63 - 1

INT       Integer data from -2^31 through 2^31 - 1

SMALLINT  Integer data from -2^15 through 2^15 - 1

TINYINT   Integer data from 0     through 255

上限に達すると、自動インクリメントは下限になります。

1
Fred