SQL Server:主键自动增量 - 删除的行和自由键值如何?

时间:2016-05-29 11:21:46

标签: sql-server entity-framework sql-server-2012

我是SQL和数据库的新手,有一件事困扰着我。

我使用SQL Server作为我的ASP.NET MVC项目,我的数据库及其表由Entity Framework使用代码优先方法自动生成。

我有一个图书集合表 - 只有CollectionIdName列。 在开发过程中,我在此表中进行了许多插入和删除操作,现在它有10行Id' s 1到10(初始条目)。但是当我添加一个新的时,它将Id设置为37.显然在过去有Id到36的条目,但现在已经消失,这些数字似乎是免费的。

那么为什么新条目没有将Id设置为11?这是一种限制还是安全功能?

感谢您的回答。

2 个答案:

答案 0 :(得分:0)

这是我们定义标识列时的默认行为。每当我们执行删除操作时,标识列的记录都会有间隙。

  

来自MSDN的评论

     

如果存在经常删除的表的标识列,则标识值之间可能会出现间隙。如果是这样的话   一个问题,不要使用IDENTITY属性。但是,要确保这一点   没有创建差距或填补现有差距,评估   在使用SET显式输入之前的现有标识值   IDENTITY_INSERT ON。

IDENTITY

答案 1 :(得分:0)

除了其他答案,它还与服务器的性能有关。服务器通常在内存中缓存一组ID,以便更快地进行分配,因为下一个号码必须存储在某个地方的磁盘上。因此,如果服务器一次分配100个数字,它只需要在标识的每100次使用(插入)中写入磁盘1。

试图保持序列中的差距会耗费大量时间。

如果您创建一个新表,插入一行,终止服务器并重新启动,您将发现下一个插入很可能包含任何数量的缓存值所包含的间隙。