[解決済み] SQL Server データベースで ID のインクリメントが飛ぶ
質問
私のテーブルの1つで
Fee
のカラム "ReceiptNo"で、SQL Server 2012 データベースの ID 増分が、次の 2 つの事柄によって、突然 1 ではなく 100 にジャンプするようになりました。
-
が 1205446 であれば 1206306 に、1206321 であれば 1207306 に、1207314 であれば 1208306 にジャンプします。ここで注意していただきたいのは、次の図に示すように、ジャンプが発生しても最後の3桁は一定、すなわち306のままであることです。
-
この問題は、コンピュータを再起動したときに発生します。
どのように解決するのですか?
SQL Server 2012 以降のパフォーマンスの向上により、この動作が発生します。
を割り当てる際に、デフォルトで 1,000 のキャッシュ・サイズを使用するようになりました。
IDENTITY
の値を
int
カラムの値を削除してサービスを再起動すると、未使用の値が失われることがあります (キャッシュサイズは
bigint
/
numeric
).
に記載されています。 のドキュメントに記載されています。
<ブロッククオート
SQL Server はパフォーマンス上の理由から ID 値をキャッシュすることがあります。
割り当てられた値の一部は、データベース障害またはサーバーの再起動時に失われる可能性があります。
サーバーの再起動時に失われることがあります。このため、挿入時に ID 値にギャップが生じることがあります。
挿入時に ID 値にギャップが生じることがあります。ギャップが許容できない場合、アプリケーションは独自のメカニズムでキー値を生成する必要があります。
を使用してキー値を生成する必要がある。シーケンスジェネレータを使用し
を使用する。
NOCACHE
オプションでシーケンスジェネレータを使用すると、決してコミットされないトランザクションにギャップを制限することができます。
を制限することができます。
表示されたデータから、12 月 22 日のデータ入力後に発生し、SQL Server が再起動したときに値が予約されたように見えます。
1206306 - 1207305
. 12 月 24 日と 25 日のデータ入力が行われた後、再度再起動し、SQL Server は次の範囲を予約しました。
1207306 - 1208305
28 日のエントリで表示されます。
異常な頻度でサービスを再起動しない限り、quot;lost" 値がデータ型によって許容される値の範囲に大きな影響を与えることはほとんどないため、最善の策はそれを気にしないことです。
これが何らかの理由で本当に問題である場合、いくつかの可能な回避策があります。
-
を使用することができます。
SEQUENCE
を使用し、より小さなキャッシュサイズを定義することができます。NEXT VALUE FOR
をカラムのデフォルトで使用します。 -
またはトレースフラグ272を適用して
IDENTITY
アロケーションがログに記録されるようにします。これは、すべてのデータベースに対してグローバルに適用されます。 -
または、最近のバージョンでは、以下を実行します。
ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF
を実行して、特定のデータベースに対する ID キャッシュを無効にすることもできます。
これらの回避策はどれもギャップがないことを保証するものではないことに注意する必要があります。これは
IDENTITY
テーブルへの挿入をシリアライズすることによってのみ可能であるためです。もし隙間のないカラムが必要な場合は、次のいずれでもなく別の解決策を使用する必要があります。
IDENTITY
または
SEQUENCE
関連
-
[解決済み] LINQでInclude()は何をするのですか?
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] SQL Server テーブルにカラムが存在するかどうかを確認する方法は?
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] SQL ServerにおけるLEFT JOINとLEFT OUTER JOINの比較
-
[解決済み] SQL Server - 挿入された行のIDを取得するための最良の方法は?
-
[解決済み] Entity Framework VS LINQ to SQL VS ADO.NETでストアドプロシージャを使う?[クローズド]
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
-
[解決済み] SQL ServerでINNER JOINを使用して削除するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PostgreSQLのCREATE DATABASE IF NOT EXISTSをシミュレートしてみませんか?
-
[解決済み] SQL Server : 列を行に変換する
-
[解決済み] 最初の行への結合方法
-
[解決済み] T-SQLでnot equalには!=と<>のどちらを使うべきですか?
-
[解決済み] カラム名の変更 SQL Server 2008
-
[解決済み] SQL ServerにおけるINSERT OR UPDATEに関する解決策
-
[解決済み] SQLのインデックスとは何ですか?
-
[解決済み] SQLサーバーで行を列に効率的に変換する
-
[解決済み] SQL ServerでGROUP BYを使って文字列を連結する方法とは?
-
[解決済み] SQL Serverで、ある日付より大きいすべての日付を照会するにはどうすればよいですか?