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