2016-05-29 40 views
0

我对SQL和数据库很陌生,有一件事困扰着我。SQL Server:主键自动增量 - 删除的行和空闲键值是什么?

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

我有一个书籍收藏表 - 只有CollectionIdName列。 在开发过程中,我在此表中进行了许多插入和删除,现在它有10行,Id的1到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

你应该永远不会***“重复使用“或”回收“以前使用过的自动生成的值。想象一下,在某个地方有一个审计表可以跟踪实体的创建情况 - 如果您在第一个对象被删除时回收该Id,那么您如何从6个月后开始说明Id = 11属于哪个对象,它后来出现了一个新的,完全独立的完全独立的对象?自动生成的ID - 一旦发布 - 完成,消失,再也不会被重复使用! –

回答

0

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

如果已存在频繁缺失的表标识列

备注,间隙可标识值之间发生。如果这是 问题,请不要使用IDENTITY属性。但是,为确保 未创建间隙或填补现有间隙,请在使用IDENTITY_INSERT ON明确输入之前先评估现有标识值。

IDENTITY

0

除了对方的回答,它也有与服务器的性能做。服务器通常在内存中缓存一组ID,以使分配速度更快,因为下一个数字必须存储在磁盘的某处。因此,如果服务器一次分配100个号码,则只需在身份的每100次使用(插入)中写入磁盘1。

试图保持序列中的差距会吸了很多时间。

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