2012-08-22 31 views
3

我注意到SQL Sever(2008 express)在插入自动递增身份规范时是随机向前跳跃的。SQL服务器标识规范不连续

例如,我的一列“HitStat_ID”将按顺序插入15,16,17,18,然后突然之间,它将决定跳转到,比如说1012,1013,1014 ....然后9120, 9121等

真的并不重要,只要他们是独特的(他们是),但它为什么会这样做?它也在不止一张桌子上... 奇怪的是,这只是在上周左右完成的,但应用程序已经开发了好几个月了!

ETA:IM在ASP.NET VB 工作这是插入(在这种情况下):

sql = "INSERT INTO [HitStats] ([PageName], [Date_and_Time], [User_ID]) values ('Home',  
'" + TheDateTime + "', '" + Session("User_ID") + "')" 
Dim dbcmd As SqlCommand = New SqlCommand(sql, dbconn) 
dbcmd.ExecuteNonQuery() 
dbcmd.Dispose() 

请不要继续有关SQL注入等等等等,它不会发生的!

+2

你是否从表中删除了数据?如果是这样,那么数字不会重置,除非您截断表。 – Taryn

+0

@bluefeet - 是的,但只说10行,没有像数字中的巨大差距。 –

回答

5

如果您使用的是应用程序和事务,当您回退事务时,您将失去生成的自动递增数字。 另外,如果你做一些插入和回滚它们。

查看更多here

另外,如果你删除数据,你就不会再得到所产生的数字,除非你做了补种。 请参阅here

+0

它是一个ASP.net web应用程序,使用标准的SQL插入单列,老实说,我不知道你的意思是交易,或回滚??! –

+0

一个事务让你可以作为一个单元执行一些代码块,如果你得到一个错误,回滚(取消)所做的更改,就像没有任何事情发生(没有插入)一样。如果您使用的是存储过程,有许多方法可以做到这一点,从c#代码或sql。也许你在不知情的情况下用c#来做这件事。看到这里http://www.c-sharpcorner.com/UploadFile/dchoksi/transaction02132007020042AM/transaction.aspx –

+1

每当你做一次回滚,上帝杀死一个自动生成的数字。对数字 –

0

如果正在复制数据库并使用Automatic Identity Range Management,这样的间隔并不少见。

会发生什么情况是将身份值块交给涉及复制的每个服务器,以便他们可以在不必与其他服务器通信的情况下发送身份值。一旦某个块在服务器上用完,它将“跳转”到已经分配给它的下一个块,这可能会用于更高范围的值。

+0

这样做肯定没有复制,只有我的开发机器上有一个服务器实例。 虽然很好的答案! –

0

@ElVieejo上关于“失败的插入”的+1。另一种可能性,某人或某事可能会添加特定值(SET IDENTITY_INSERT ON) - 这可能解释了很大的差距。

+0

不错的想法,但是sql语句只插入了2个其他字段,而不是标识字段。 # –