说我有一个带有自动递增主键的表。在Oracle中,自动递增是通过序列完成的,而在SQL Server中,这是在创建表时使用IDENTITY
关键字预先定义的。
我手动插入记录此表并包括主键值。 Oracle中这会导致问题,因为序列仍然在此之前插入引用的最后一个值。
SQL Server中的行为是什么?
答案 0 :(得分:2)
从精美的手册中:
任何时候,会话中只有一个表可以将IDENTITY_INSERT属性设置为ON。如果某个表已将此属性设置为ON,和SET IDENTITY_INSERT ON语句发出另一个表,SQL Server将返回指出SET IDENTITY_INSERT的错误信息已经打开,并报告表将其设置为ON。
如果插入的值大于表的当前标识值越大,SQL Server自动使用新的插入值作为当前标识值。 SET IDENTITY_INSERT的设置是在执行或运行时设置的,而不是在解析时设置的。
答案 1 :(得分:-1)
默认情况下,身份以1开头,以1递增。但是,它不会被隔离为序列。例如,如果插入失败,则可以“丢失”一个数字。
对于SQL Server,这无关紧要。您应该将身份视为帮助器功能。最后,由主键(或唯一性约束)确定行是否可接受。
因此,如果您手动创建带有“丢失”数字或“身份”将永远无法到达的数字的行(例如,如果使用默认的起始数字和增量,则为0或-1),则根本不会有问题
如果您插入下一个标识,则主键将导致下一次常规插入失败。之后,您将不再有任何问题,因为身份将继续。