唯一键约束违规时的主键标识值增量

时间:2010-03-27 18:04:56

标签: sql primary-key unique-key

我有一个SqlServer 2008表,它有一个主键(IsIdentity = Yes)和另外三个构成唯一键约束的字段。

另外,我有一个将记录插入表中的存储过程,并使用SqlConnection对象通过C#调用sproc。

C#sproc调用工作正常,但是当C#sproc调用违反Unique Key约束时,我注意到了有趣的结果....

当sproc调用违反Unique Key约束时,抛出SqlException - 这并不奇怪和酷。但是,我注意到成功添加到表中的下一条记录的PK值并不比前一条记录多一个 -

例如:假设该表有五条记录,其中PK值为1,2,3,4和5.该sproc尝试插入第六条记录,但违反了Unique Key约束,因此,第六条记录记录未插入。然后sproc尝试插入另一条记录,这次它成功了。 - 这个新记录的PK值为7而不是6.

这是正常行为吗?如果是这样,你能告诉我为什么会这样吗? (如果记录未能插入,为什么PK索引会增加?)

如果这不是正常行为,你能否给我一些提示,看看为什么我会看到这些症状?

1 个答案:

答案 0 :(得分:6)

是的,这是正常的。

想象一下这里发生的事务,这是在SQL Server上运行的潜在操作顺序。

  1. 使用ID 1,2,3,4,5。
  2. 客户A开始交易。
  3. 客户端A执行插入但不提交(ID 6)。
  4. 客户B开始交易。
  5. 客户端B执行插入但不提交。 (ID 7)。
  6. 客户A回滚。
  7. 客户B提交。
  8. 由于(不一定存在)此行为的可能性,您会看到在插入失败时跳过ID 6。