sql >> データベース >  >> RDS >> Sqlserver

IDENTITY列の値にギャップがあるのはなぜですか?

    列の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にする必要があります。



    1. PostgreSQLですべてのユーザーを一覧表示する方法

    2. SQL Serverエージェントジョブ(T-SQL)のジョブステップを取得する3つの方法

    3. MySQLストアドプロシージャ

    4. pg_viewsのクエリからの不完全な情報