質問

SQL Server 2005がIDENTITY列の最大値に達するとどうなりますか?それは最初から始まり、ギャップを埋め始めますか?

SQL Server 2005の発生時の動作はどのようなものですか?

役に立ちましたか?

解決

最大値に達するとオーバーフローエラーが発生します。最大値 9,223,372,036,854,775,807 のbigintデータ型を使用する場合、ほとんどの場合そうではありません。

表示されるエラーメッセージは次のようになります。

Msg 220, Level 16, State 2, Line 10
Arithmetic overflow error for data type tinyint, value = 256.

(ソース)

私が知る限り、MS SQLにはIDギャップを埋める機能がありません。したがって、これを自分で行うか、ID列のデータ型を変更する必要があります。

これに加えて、使用する値の範囲をさらに広げるために、開始値を最小の負の数に設定できます。

このトピックに関する優れたブログ投稿

他のヒント

ギャップは埋められません。代わりに、列の定義を変更してIDを削除し、ギャップを埋める他の方法を見つけるか、サイズを大きくする(intからbigintに進む)か、データのタイプを変更する(intからdecimalに変更するまで挿入は失敗します)より多くのID値を使用できるようにします。

問題を解決するまで、新しい行を挿入できず、上記のエラーメッセージが表示されます。これはいくつかの方法で実行できます。まだデータがあり、最大以下のすべてのIDを使用している場合は、データ型を変更する必要があります。データが定期的にパージされ、使用されない大きなギャップがある場合、ID番号をそのギャップ内の最小の番号に再シードできます。たとえば、以前の仕事では、トランザクションを記録していました。 1か月あたり4,000〜5,000万だったかもしれませんが、6か月以上経過したものはすべてパージしていました。そのため、数年ごとに20億近くになりますが、15億未満のid 0に戻ります。これらのどちらも機能しない可能性があり、別の解決策を見つける必要があります。

ID列が整数の場合、最大値は2,147,483,647です。それを超えると、オーバーフローエラーが発生します。

これがリスクだと思う場合は、BIGINTデータ型を使用してください。これにより、最大9,223,372,036,854,775,807が得られます。これほど多くの行があるデータベーステーブルは想像できません。

さらなる議論こちら。 (言及されたxslと同じリンク)。

ID列の最大数に達した場合、そのテーブルからより大きなID列タイプを持つセカンダリテーブルにデータを移動し、新しいID値の開始値を最大に指定できます前のタイプの。新しいID値はその時点から継続されます。

「古い値」を削除した場合時々シードをリセットする必要があります DBCC CHECKIDENT( 'MyTable'、RESEED、0);

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top