2016-05-29 10 views
0

私はSQLとデータベースに新しいことがあります。私には気になることが1つあります。SQL Server:主キーの自動インクリメント - 削除された行と空きキーの値はどうですか?

私はASP.NET MVCプロジェクトにSQL Serverを使用しています。データベースとそのテーブルは、コード優先アプローチを使用してEntity Frameworkによって自動生成されました。

書籍のコレクション用のテーブルがあります。ちょうどCollectionIdNameの列です。 私はこのテーブルで多くの挿入と削除を行いましたが、現在はIdの1から10までの10行(初期エントリ)があります。しかし、私が新しいものを追加すると、Idが37に設定されています。明らかに、過去には、Idのエントリが36個までありましたが、現在はなくなり、これらの数字は無料です。

なぜ、新しいエントリのIdが11に設定されていないのですか?それは一種の制限か、あるいはセキュリティ機能でしょうか?

ありがとうございました。

+0

https://www.google.ge/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=sql%20server%20identity%20reuse –

+4

あなたは***しないでください*** "以前に使用された自動生成値を「再利用」または「リサイクル」します。エンティティを追跡する監査テーブルがあると想像してください - 最初から6番目のオブジェクトが削除されたときにそのIDをリサイクルし、それは新しい、完全に別個の完全に独立したオブジェクトに後で出ますか?自動生成されたID(一度発行されたID)は完了していますが、もう一度再利用することはありません。 –

答えて

0

これはID列を定義するときのデフォルトの動作です。削除操作を実行するたびに、ID列のレコードにはギャップが存在します。 ID列が頻繁に欠失を有するテーブルに存在する場合、ギャップが同一の値の間で発生する可能性がMSDN

から

解説。これが である場合は、IDENTITYプロパティを使用しないでください。ただし、 にギャップが作成されていないこと、または既存のギャップを埋めるには、 の既存のID値を評価する前に、明示的にSET IDENTITY_INSERT ONを入力する必要があります。他の回答に加えて

IDENTITY

0

、それはまた、サーバのパフォーマンスに関係しています。通常、サーバはIDのグループをメモリにキャッシュしているため、次の番号をディスクのどこかに格納する必要があるため、割り当てがずっと高速になります。したがって、サーバーが一度に100個の番号を割り当てる場合、IDの100個の使用(挿入)のうちディスク1に書き込むだけで済みます。

シーケンスのギャップを維持しようとすると、多くの時間がかかります。

新しいテーブルを作成して1つの行を挿入し、サーバーを強制終了して再起動すると、キャッシュされた値の数に関係なく、次の挿入にはおそらくギャップが含まれています。

関連する問題