SQL Serverでは、新しい行の挿入を伴うトランザクションがロールバックされると、IDフィールドの数値がスキップされます。
たとえば、Foos
テーブルの最大IDが99の場合、新しいレコードを挿入しようとしますFoo
が、ロールバックすると、ID 100は「使い果たされ」、次のFoo
行には101の番号が付けられます。
IDフィールドがシーケンシャルであることが保証されるように、この動作を変更する方法はありますか?
SQL Serverでは、新しい行の挿入を伴うトランザクションがロールバックされると、IDフィールドの数値がスキップされます。
たとえば、Foos
テーブルの最大IDが99の場合、新しいレコードを挿入しようとしますFoo
が、ロールバックすると、ID 100は「使い果たされ」、次のFoo
行には101の番号が付けられます。
IDフィールドがシーケンシャルであることが保証されるように、この動作を変更する方法はありますか?
あなたが求めているものは、ID列では機能しません。
これらは、待機やデッドロックなどを引き起こさないように、設計上「放棄」して忘れるように設計されています。このプロパティにより、IDENTITY列を、遅延やボトルネックのない高度なトランザクションシステム内でシーケンスとして使用できます。
ギャップがないことを確認するということは、最初の挿入がロールバックされるかどうかを判断するための非常に長いキューがあるため、毎秒100挿入のシステムを実装する方法がないことを意味します。
同じ理由で、通常、この動作や、大量のテーブルのこのような数列は必要ありません。ただし、非常にまれな単一プロセスのテーブル(毎月の単一プロセスによる請求書番号など)の場合、トランザクションをMAX(number)+1
または同様のクエリの周りに配置することは許容されます。
declare @next int
update sequence_for_tbl set @next=next=next+1
.. use @next