在我的其中一个表“ReceiptNo”中的费用中,SQL Server 2012 数据库标识增量突然开始跳转到 100 而不是 1,这取决于以下两件事。如果它是 1205446 我...
在我的其中一个表 Fee
中,SQL Server 2012 数据库标识增量的列'ReceiptNo'突然开始跳转到 100 而不是 1,这取决于以下两件事。
p2
p3
无论规模大小,这仍然是许多开发人员和应用程序中的一个非常常见的问题。
不幸的是,上述建议并不能解决所有情况,例如共享主机,您不能依赖主机来设置 -t272 启动参数。
此外,如果您现有的表使用这些标识列作为主键,则删除这些列并重新创建新列以使用 BS 序列解决方法将是一项巨大的努力。序列解决方法仅适用于在 SQL 2012+ 中从头开始设计新表的情况
底线是,如果您使用的是 SQL Server 2008R2,那么请继续使用它。认真地,继续使用它。除非微软承认他们引入了一个巨大的错误(即使在 SQL Server 2016 中仍然存在),否则我们不应该升级,直到他们拥有并修复它。
微软直接引入了一项重大更改,即他们破坏了一个不再按设计工作的 API,因为他们的系统在重新启动时会忘记其当前身份。无论有没有缓存,这都是不可接受的,名为 Bryan 的微软开发人员需要拥有它,而不是告诉全世界它是“设计使然”和“功能”。当然,缓存是一项功能,但忘记下一个身份应该是什么,就不是一项功能了。这是一个该死的 BUG!!!
我将分享我使用的解决方法,因为我的数据库位于共享托管服务器上,而且,我不会删除并重新创建主键列,这将是一个巨大的 PITA。
相反,这是我的可耻的黑客行为(但不像微软引入的这个 POS 漏洞那么可耻)。
在插入命令之前,只需在每次插入之前重新播种您的身份即可。仅当您对 Sql Server 实例没有管理员控制权时才建议使用此修复程序,否则我建议在重新启动服务器时重新播种。
declare @newId int -- where int is the datatype of your PKey or Id column
select @newId = max(YourBuggedIdColumn) from YOUR_TABLE_NAME
DBCC CheckIdent('YOUR_TABLE_NAME', RESEED, @newId)
只需在插入之前添加这 3 行,就可以了。它实际上不会对性能产生太大影响,也就是说,它不会引人注意。
祝你好运。