从数据库中删除一行时,为什么不“IsIdentity”减少行ID?

时间:2012-06-14 07:39:53

标签: database

我的产品表中有3条记录,分别为ProducID 1,2,3。
当我删除记录号3并在其后插入新记录时,ProdcutID将为4.
我的问题是为什么没有给那一行索引3?

4 个答案:

答案 0 :(得分:1)

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

因此新行的PK值是4,40,400,40000还是365623563无关紧要

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

编辑:

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

答案 1 :(得分:0)

因为身份号码存储在表格或数据库中(我现在不确定)并且没有“恢复”,但只是为每次插入操作增加。

答案 2 :(得分:0)

因为3被分配给记录。即使在死亡中,它也将永远保持这种分配。把它想象成是暮光之城,只有身份证。

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

如果你没有一个完全受约束的数据库(糟糕的做法),那么你可能最终得到这个回滚的ID,无意中继承了旧的#3的孩子等。这也会让审计和交易历史变得混乱。

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

答案 3 :(得分:0)

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

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