1

一部のテーブルで作成された ID が正確に連続していないことがわかり始めました。つまり、それらは段階的に高いままですが、値には大きなギャップがあります.

たとえば、シーケンスは {1,2,3.. .. 97,98,99} で、次に {1092,1093,1094.. .. 1097,1098,1099} にジャンプし、その後に別のギャップが続き、{ 4231,4232,4233.. ..4257,4258,4259}.

誰でもこの動作に光を当てることができますか?

4

4 に答える 4

2

ID列のあるテーブルへの挿入を実行し、挿入が失敗した場合(何らかの理由で)、ID値は引き続きインクリメントされ、次の挿入はギャップを残します。また、行を削除すると、明らかにギャップが生じます。

代理キーの実際の値、またはあるテーブルの1つまたは複数の行を別のテーブルの行に接続するための「接続値」以外のIDに依存したり、使用したりしないでください。確かに、値のシーケンスが連続していることや、値が時系列で増加していることに依存することはありません。

于 2013-03-21T16:56:51.133 に答える
1

これは既知のバグです。大きなギャップは、フェイルオーバー、サービスの再起動、再起動などが原因で発生します。

http://connect.microsoft.com/SQLServer/feedback/details/739013/failover-or-restart-results-in-reseed-of-identity

修正されるまでは、影響を受けるすべてのテーブルのID列を再シードする起動手順がある場合を除いて、それについてできることはほとんどありません。

于 2013-03-21T17:33:53.023 に答える
1

ID 列を持つテーブルに挿入するたびに、ID がインクリメントされます。行を削除した場合、またはそのテーブルへの挿入をロールバックした場合でも、ID 列は新しい増分のままです。

以下は、トランザクションのロールバックの効果を示すスクリプトです。

create table #temp (TheKey int identity(1,1), TheValue int)

insert into #Temp (TheValue) values (1)
select max(TheKey) from #Temp  --1 as expected

begin tran 
insert into #Temp (TheValue) values (1)
select max(TheKey) from #Temp  --2 as expected
rollback
select max(TheKey) from #Temp  --1 as expected

insert into #Temp (TheValue) values (1)
select max(TheKey) from #Temp  --3 a little bit of a surprise?
于 2013-03-21T17:02:51.220 に答える
1

サーバーはパフォーマンスのために値をキャッシュしているように見えるため、たとえば停電後にサーバーがリセットされると、それらの値が失われる可能性があります。この記事を参照してください。

サーバーの再起動またはその他の障害後の連続値

于 2013-03-21T17:05:01.997 に答える