Sql 主键标识值在唯一键约束冲突时递增

Sql 主键标识值在唯一键约束冲突时递增,sql,primary-key,unique-key,Sql,Primary Key,Unique Key,我有一个SQLServer2008表,它有一个主键(IsIdentity=Yes)和三个其他字段,它们构成了唯一键约束 此外,我还有一个存储过程,可以在表中插入一条记录,并使用SqlConnection对象通过C#调用存储过程 C#存储过程调用工作正常,但我注意到当C#存储过程调用违反唯一键约束时,会出现有趣的结果 当存储过程调用违反唯一键约束时,将抛出SqlException——这并不奇怪,也很酷。但是,我注意到,成功添加到表中的下一条记录的PK值并不比上一条记录的PK值多一个- 例如:假设该

我有一个SQLServer2008表,它有一个主键(IsIdentity=Yes)和三个其他字段,它们构成了唯一键约束

此外,我还有一个存储过程,可以在表中插入一条记录,并使用SqlConnection对象通过C#调用存储过程

C#存储过程调用工作正常,但我注意到当C#存储过程调用违反唯一键约束时,会出现有趣的结果

当存储过程调用违反唯一键约束时,将抛出SqlException——这并不奇怪,也很酷。但是,我注意到,成功添加到表中的下一条记录的PK值并不比上一条记录的PK值多一个-

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

这是正常的行为吗?如果是,你能给我一个原因吗?(如果记录插入失败,为什么PK索引会增加?)

如果这不是正常行为,您能给我一些提示,说明我为什么会出现这些症状吗?

是的,这是正常的

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

  • 使用ID 1、2、3、4、5
  • 客户机A开始交易
  • 客户端A执行插入但不提交(ID 6)
  • 客户B开始交易
  • 客户端B执行插入但不提交。(ID 7)
  • 客户端A回滚
  • 客户B提交

  • 由于这种行为的可能性(不一定存在),当插入失败时,您会看到跳过ID 6。

    是的,您永远不能指望标识字段从不跳过值。