如果重写在SQL Server自动递增的主键值会发生什么?

时间:2019-02-02 20:03:06

标签: sql-server

说我有一个带有自动递增主键的表。在Oracle中,自动递增是通过序列完成的,而在SQL Server中,这是在创建表时使用IDENTITY关键字预先定义的。

我手动插入记录此表并包括主键值。 Oracle中这会导致问题,因为序列仍然在此之前插入引用的最后一个值。

SQL Server中的行为是什么?

2 个答案:

答案 0 :(得分:2)

从精美的手册中:

备注

  

任何时候,会话中只有一个表可以将IDENTITY_INSERT属性设置为ON。如果某个表已将此属性设置为ON,和SET IDENTITY_INSERT ON语句发出另一个表,SQL Server将返回指出SET IDENTITY_INSERT的错误信息已经打开,并报告表将其设置为ON。

     

如果插入的值大于表的当前标识值越大,SQL Server自动使用新的插入值作为当前标识值。   SET IDENTITY_INSERT的设置是在执行或运行时设置的,而不是在解析时设置的。

https://docs.microsoft.com/en-us/sql/t-sql/statements/set-identity-insert-transact-sql?view=sql-server-2017

答案 1 :(得分:-1)

默认情况下,身份以1开头,以1递增。但是,它不会被隔离为序列。例如,如果插入失败,则可以“丢失”一个数字。

对于SQL Server,这无关紧要。您应该将身份视为帮助器功能。最后,由主键(或唯一性约束)确定行是否可接受。

因此,如果您手动创建带有“丢失”数字或“身份”将永远无法到达的数字的行(例如,如果使用默认的起始数字和增量,则为0或-1),则根本不会有问题

如果您插入下一个标识,则主键将导致下一次常规插入失败。之后,您将不再有任何问题,因为身份将继续。

相关问题