10

SQL Server 2005 で IDENTITY 列が最大値に達した場合はどうなりますか? 最初から始めて、ギャップを埋め始めますか?

この問題が発生した場合、SQL Server 2005 はどのような動作をしますか?

4

6 に答える 6

14

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

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

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

(ソース)

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

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

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

于 2008-11-04T15:18:12.803 に答える
1

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

于 2008-11-04T15:19:30.943 に答える
1

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

于 2008-11-04T15:51:14.547 に答える
0

「古い値」を時々削除する場合は、DBCC CHECKIDENT ('MyTable', RESEED, 0); を使用してシードをリセットするだけです。

于 2009-08-21T14:28:02.350 に答える
0

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

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

ここでさらに議論します。(言及されたxslと同じリンク)。

于 2008-11-04T15:22:45.290 に答える
0

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

于 2008-11-04T16:36:59.010 に答える