列のIDプロパティは、次のことを保証するものではありません :
価値の独自性 –一意性は、PRIMARY KEY、UNIQUE制約、またはUNIQUEインデックスを使用して適用する必要があります。
トランザクション内の連続する値 –複数の行を挿入するトランザクションは、他の同時挿入がテーブルで発生する可能性があるため、行の連続値を取得することは保証されません。値が連続している必要がある場合、トランザクションはテーブルの排他ロックを使用するか、SERIALIZABLE分離レベルを使用する必要があります。
サーバーの再起動またはその他の障害後の連続した値 –SQL Serverは、パフォーマンス上の理由でID値をキャッシュする場合があり、割り当てられた値の一部は、データベースの障害またはサーバーの再起動中に失われる可能性があります。これにより、挿入時にID値にギャップが生じる可能性があります。ギャップが許容できない場合、アプリケーションはNOCACHEオプションを備えたシーケンスジェネレーターを使用するか、独自のメカニズムを使用してキー値を生成する必要があります。
値の再利用 –特定のシード/増分を持つ特定のIDプロパティの場合、ID値はエンジンによって再利用されません。特定の挿入ステートメントが失敗した場合、または挿入ステートメントがロールバックされた場合、消費されたID値は失われ、再度生成されることはありません。これにより、後続のID値が生成されるときにギャップが生じる可能性があります。
また、
頻繁に削除されるテーブルのID列が存在する場合、ID値の間にギャップが発生する可能性があります。これが懸念される場合は、IDENTITYプロパティを使用しないでください。ただし、ギャップが作成されていないことを確認するため、または既存のギャップを埋めるために 、SET IDENTITY_INSERT ON
で明示的に入力する前に、既存のID値を評価します 。
また、ID列のプロパティを確認し、ID増分値を確認してください。 1にする必要があります。