SQLServer2012でIDENTITYで採番しているフィールドのインクリメントが
おかしくなる件。
意図しない番号増が発生します。。
同じことを2008、2014で試してみたけど再現しませんでした。
id・・・Numeric(18,0) ID ENTITY にしておいて…
このテーブルに対してInsertを実行。IDENTITYの値を取得。( SELECT SCOPE_IDENTITY() の方がいいんだけど…w)
1がとれます。
もう1回やると…
2になります。
ここでSQLServerのサービスを再起動。
再度Insertを実行すると…
取得した値は 10002… 急に10000も増えました。
再度サービス再起動からのInsert実行で…
さらに10000増加してしまいました。
当然テーブルの中身を見るとこんな感じ。
この時にSELECT IDENT_CURRENT(‘Table_1’) as ID でIDを取得すると
サービス再起動前は 20002 で この状態で再起動すると 30002 に。
一気に10000増加するとか本当に困ります。
このへんで同じような情報もありました。
これ読むと
-
サーバーの再起動または他のエラーが発生した後の連続した値: SQL Server では、パフォーマンス上の理由から ID 値をキャッシュすることがあります。割り当てられた値の一部は、データベースの障害やサーバーの再起動が発生したときに失われることがあります。 その結果、挿入時に非連続的な ID 値が生成される場合があります。 非連続的な値が許可されない場合、アプリケーションでは、シーケンス ジェネレーターを NOCACHE オプションを指定して使用するか独自のメカニズムを使用して、キー値を生成する必要があります。
ってありますが…。
シーケンステーブル作ってやった方がいいのかしら。。
<追記>
IDENTITY プロパティ使用時の動作について
MS サポートブログに載ってました。
Bigintの場合に10000キャッシュされるようですね。。
仕様か。。
コメント