为什么即使插入失败,SQL Server仍会生成一个新的标识值?

时间:2019-06-13 22:27:51

标签: sql-server

创建表并将其各自字段设置为IDENTITY的查询如下:

CREATE TABLE user (
    email varchar(100) primary key
    name varchar(30),
    pwd varchar(10) 
)

更改表以添加IDENTITY字段:

ALTER TABLE user ADD id int /*NOT NULL*/ IDENTITY;

如果设置了NULL或DUPLICATED值,则将email字段作为PRIMARY KEY INDEX将会失败,例如假设myemail@domain.com已经存在,确定查询失败,但是我将电子邮件更改为{ {1}} SQL Server根据之前失败的查询为IDENTITY字段生成一个新的one值。我的问题是为什么会这样? (这也仅适用于SQL Server或其他数据库提供程序)

1 个答案:

答案 0 :(得分:4)

好吧,这在"CREATE TABLE (Transact-SQL) IDENTITY (Property)"中有明确记录:

  
      
  • 值的重用-对于具有特定种子/增量的给定身份属性,引擎不会重用身份值。如果特定的插入语句失败或插入语句回滚,则使用的标识值将丢失并且不会再次生成。生成后续标识值时,这可能会导致出现空白。
  •   

文档的进一步内容还回答了原因,并建议了在不可接受的情况下该怎么做:

  

这些限制是设计的一部分,目的是提高性能,并且在许多常见情况下都是可以接受的。如果由于这些限制而无法使用标识值,请创建一个包含当前值的单独表,并管理应用程序对该表的访问和数字分配。