0

我的 Products 表中有 3 条记录,ProductID 分别为 1、2、3。
当我删除第 3 条记录并在之后插入一条新记录时,ProdcutID 将为 4。
我的问题是为什么不给该行提供索引 3?

4

4 回答 4

1

因为人工(又名“代理”)主键值——这就是自动增量列——没有任何意义

所以新行的PK值是4、40、400、40000还是365623563都没有关系

如果您的代码依赖于主键中递增的无间隙值,则您必须重新考虑您的代码。

编辑:

发生这种情况还有一个技术原因:为了使自动增量(或大多数数据库中的序列)在具有并发事务的环境中快速正确,必须对序列/自动增量可以做什么有一定的限制。其中之一是它们从不递减(或者更准确地说:从不改变方向,因为可能存在递减序列)并且它们不是事务控制的一部分。因此,一旦获得了一个值,它就会从底层生成器中“消失”。

于 2012-06-14T07:44:20.213 回答
0

因为标识号存储在表或数据库中(我现在不确定)并且没有“还原”,而只是在每次插入操作时递增。

于 2012-06-14T07:44:10.607 回答
0

因为 3 被分配给一个记录。它将永远保持这种分配,即使在死亡时也是如此。把它想象成《暮光之城》,只有 ID。

不过说真的,许多企业应用程序无论如何都不再硬删除行,而是出于历史目的而更喜欢软删除。

如果您没有一个完全受限的数据库(不好的做法),那么您最终可能会因为这个回滚 ID 无意中继承旧的 #3 的子代等。它还会使审计和事务历史记录等事情变得混乱。

如果一个事务删除了一行,而另一个事务插入了,会发生什么?在自动增量世界中,没有隐含的锁定,在 id 重用世界中,事情很快就会变得混乱。

于 2012-06-14T07:44:32.227 回答
0

当 IDENTITY 属性与 CREATE TABLE 一起使用时,Microsoft® SQL Server™ 使用 CREATE TABLE 的 NOT FOR REPLICATION 选项来覆盖标识列的自动递增。通常,SQL Server 为插入表中的每个新行分配一个值,该值比前一个最大值大一些。但是,如果从另一个数据源复制新行,则标识值必须与它们在数据源中的完全相同。

这是一个参考http://msdn.microsoft.com/en-us/library/aa933196(v=sql.80).aspx

于 2012-06-14T07:51:51.710 回答