Sql server 2012 还原后的SQL Server 2012标识列

Sql server 2012 还原后的SQL Server 2012标识列,sql-server-2012,Sql Server 2012,我刚刚在SQL Server 2012上做了一些测试,以练习备份和恢复 我创建了一个简单的表,表中几乎没有列,其中一个是ID(int)标记为identity列 我添加了3条记录,ID被自动设置为1,然后是2,然后是3。。。嗯 我备份了数据库,然后进行了全面恢复 恢复后,我尝试添加一条新记录,但奇怪的是,新ID是1003(而不是4),再次添加一条新记录时,ID是1004(好的,它再次从上一条增加) 所以我再次尝试备份数据库,然后恢复它 尝试添加新记录并猜测。。。新的ID是2004年(而不是1005

我刚刚在SQL Server 2012上做了一些测试,以练习备份和恢复

我创建了一个简单的表,表中几乎没有列,其中一个是
ID
int
)标记为
identity

我添加了3条记录,
ID
被自动设置为1,然后是2,然后是3。。。嗯

我备份了数据库,然后进行了全面恢复

恢复后,我尝试添加一条新记录,但奇怪的是,新ID是1003(而不是4),再次添加一条新记录时,ID是1004(好的,它再次从上一条增加)

所以我再次尝试备份数据库,然后恢复它

尝试添加新记录并猜测。。。新的ID是2004年(而不是1005年),然后是2005年、2006年之后的记录,以此类推

似乎每次恢复后,标识列都会以某种方式出现混乱


这是正常的行为吗

是的,这是正常的行为

标识将保留一定大小的值块并缓存这些值。如果您的服务器宕机,或者您执行备份/恢复,则该保留区块中尚未使用的缓存值将丢失,并且不会返回

这不是一个问题!
IDENTITY
系统只是确保它正确地为您提供升序值-它从来没有保证“没有间隙”-间隙不是一个问题,真的


查看Aaron Bertrand的博客文章,了解更多关于
身份
的信息,以及从
身份

中除了什么(以及什么可以期待),你确定你在和2008年的服务器交谈吗?因为这是2012年众所周知的行为。此外,如果你关心分配的数字,你可能用错了。您应该将标识值视为恰好适合数字列的不透明斑点。是的,这是正常行为。
IDENTITY
将保留某个值块并缓存这些值-如果您的服务器停机,或者您执行备份/恢复,则该保留块中的剩余值将丢失且不会返回。这不是问题!
IDENTITY
系统只是确保它正确地提供升序值-它从来没有保证“没有间隙”-间隙不是问题,真的@拉胡尔-我没说虫子,我说的是行为。尝试搜索
SQLServer2012身份跳转
,您应该会找到大量的参考资料。@Damien_不信者,啊!!误读了你的评论。删除了我的。对不起,你是对的,这是2012年!谢谢你,马克!这很好地解释了发生的事情:)