SQL Server の自動インクリメント主キーの上限は? SQL Server 自動インクリメント主キーが上限に達するとどうなりますか?
5 に答える
ジョエルの答えは正しいです。それは、使用するデータ型の上限です。
そのうちの 2 つの例を次に示します。
- 整数: 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 は簡単ですが、コード ベースで問題が発生する可能性があります。
- ID 列が重要でない場合 (外部キーではないなど)、データベースを再シードして ID 列をリセットするだけです。
- ID 列をより大きな数値に変更します。たとえば、int をオーバーフローした場合は、ID 列を big int に変更します。幸運が溢れています:)
おそらく他にも修正がありますが、簡単な特効薬はありません。たくさんの関係の中心であるテーブルでこれが起こらないことを願っています。それは難しい修正ではなく、退屈で長い修正です。
データ型によって異なります。bigint を使用すると、オーバーフローする可能性はほとんどなくなります。通常の int でさえ、数十億行になります。オーバーフローしたことはないので、オーバーフローしたらどうなるかわかりません。
何が起こるかをお話しします....私のデータはその特定のテーブルへの挿入を停止しました。データベースは引き続き機能しますが、データが欠落していて一貫性がないことがわかりました。少し調べてみると、エラーテーブルが見つかり、手動で挿入しました。エラーは上記と同じです。
列をBIGINTに変更する必要がありました。やや遅いサーバー上の26GBデータベースでは、約30分かかりました。データベースのアーカイブバージョン(150GB程度)では、かなり時間がかかりました。
幸いなことに、このテーブルにはあまり多くの関係がないため、痛みはごくわずかでした。
DBCC CHECKIDENT (SomeTable、RESEED、1)
これにより、テーブル 'SomeTable' の ID が 1 にリセットされます
これがこれを行うための最良の方法であるかどうかはわかりません。
データ型の説明:
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
上限に達すると、自動インクリメントは下限になります。