在 SQL Server 中,如果涉及插入新行的事务被回滚,则会在标识字段中跳过一个数字。
例如,如果Foos
表中的最高 ID 为 99,那么我们尝试插入新Foo
记录但回滚,则 ID 100 被“用完”,下一Foo
行将编号为 101。
有什么方法可以改变这种行为,以保证身份字段是连续的?
在 SQL Server 中,如果涉及插入新行的事务被回滚,则会在标识字段中跳过一个数字。
例如,如果Foos
表中的最高 ID 为 99,那么我们尝试插入新Foo
记录但回滚,则 ID 100 被“用完”,下一Foo
行将编号为 101。
有什么方法可以改变这种行为,以保证身份字段是连续的?
您所追求的永远不会与身份列一起使用。
它们被设计为“放弃”并忘记,设计使它们不会导致等待或死锁等。该属性允许 IDENTITY 列用作高度事务性系统中的序列,没有延迟或瓶颈。
确保没有间隙意味着没有办法实现每秒 100 次插入的系统,因为要确定第一次插入是否要回滚需要很长的队列。
出于同样的原因,您通常不需要这种行为,也不需要这种用于大容量表的数字序列。但是,对于非常罕见的单进程表(例如每月单个进程的发票编号),可以将事务围绕MAX(number)+1
或类似查询放置,例如
declare @next int
update sequence_for_tbl set @next=next=next+1
.. use @next