SQL Server の IDENTITY 列値のギャップ: IDENTITY プロパティについて
自動インクリメントされる IDENTITY 列を含むテーブルにレコードを挿入しても、必ずしも連続した ID 値が得られるわけではありません。この違いは、IDENTITY プロパティの固有の特性の結果です。
IDENTITY 属性の制限事項:
-
非一意性: IDENTITY 列自体は値の一意性を強制しません。重複しない単一の値を確保するには、PRIMARY KEY や UNIQUE などの追加の制約を使用する必要があります。
-
非連続トランザクション値: 同時挿入により、トランザクション内の IDENTITY 値の順序が混乱する可能性があります。
-
サーバー障害後のギャップ: SQL Server はパフォーマンスのために IDENTITY 値をキャッシュすることがあります。これにより、サーバーの再起動または障害時に値が失われ、シーケンスにギャップが生じる可能性があります。
-
値の再利用防止: IDENTITY 値は、挿入の失敗やロールバックの後でも、特定のシード/インクリメントの組み合わせ内では再利用されません。隙間が生じる可能性があります。
管理上のギャップ:
-
ギャップの形成を避ける: IDENTITY 列を含むテーブルを頻繁に削除すると、ギャップが発生する可能性があります。これが問題となる場合は、代替キー生成メカニズムの使用を検討してください。
-
明示的な値の挿入: IDENTITY 列に明示的な値を指定するには、SET IDENTITY_INSERT ON を使用します。ただし、最初に既存の値をチェックして、ギャップが作成されていないことを確認してください。
-
Identity 列プロパティ: 一貫したシーケンスを維持するために、Identity 列のデルタ値が 1 に設定されていることを確認してください。
IDENTITY プロパティは自動インクリメント値を提供しますが、一意性や連続値を保証したり、サーバー障害をシームレスに処理したりするものではないことに注意してください。
以上がSQL Server の IDENTITY 列の値にギャップが現れるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。