Products テーブルには、ProducID がそれぞれ 1、2、3 の 3 つのレコードがあります。
レコード番号 3 を削除してから新しいレコードを挿入すると、ProdcutID は 4 になります。
私の質問は、なぜその行にインデックス 3 を与えないのですか?
4 に答える
3がレコードに割り当てられたため。死んでも、それはこの割り当てをこれまで以上に保持します。IDだけで、トワイライトサーガのように考えてください。
しかし、真剣に、多くのエンタープライズアプリケーションは、とにかく行をハード削除することはなくなり、履歴目的でソフト削除を優先します。
完全に制約されたデータベースを持っていない場合(悪い習慣)、このロールバックされたIDが誤って古い#3の子などを継承してしまう可能性があります。また、監査やトランザクション履歴などが混乱する可能性があります。
あるトランザクションが行を削除し、別のトランザクションが挿入された場合はどうなりますか?自動インクリメントの世界では、ロックが暗示されることはありません。IDの再利用の世界では、物事はすぐに混乱します。
CREATE TABLE で IDENTITY プロパティを使用すると、Microsoft® SQL Server™ は CREATE TABLE の NOT FOR REPLICATION オプションを使用して、ID 列の自動インクリメントをオーバーライドします。通常、SQL Server は、テーブルに挿入された新しい行ごとに、以前の最大値よりも少し大きい値を割り当てます。ただし、新しい行が別のデータ ソースからレプリケートされる場合、ID 値はデータ ソースのときとまったく同じままである必要があります。
ここに参照http://msdn.microsoft.com/en-us/library/aa933196(v=sql.80).aspxがあります