SQL Server 2012 Express中的标识列问题

SQL Server 2012 Express中的标识列问题,sql,sql-server,sql-server-2012-express,Sql,Sql Server,Sql Server 2012 Express,我正在将带有主键的Identity列设置为一个名为UserId的列。因此,它将自动递增。它在我的SQLServer2008R2中运行良好。但在此之前,我将其升级到SQLServer2012 它工作正常,但不知道出了什么问题,它的数量突然从13增加到1008 例如,最后一个递增的数字是13,所以之后应该是14,但它直接递增为1008,这在13到1007之间有很大的差距 在这种情况下我该怎么办?我没有删除任何行。出于性能原因,将缓存标识值 当SQL Server启动时,它会保留一大块值。如果SQL

我正在将带有主键的
Identity
列设置为一个名为
UserId
的列。因此,它将自动递增。它在我的SQLServer2008R2中运行良好。但在此之前,我将其升级到SQLServer2012

它工作正常,但不知道出了什么问题,它的数量突然从13增加到1008

例如,最后一个递增的数字是13,所以之后应该是14,但它直接递增为1008,这在13到1007之间有很大的差距


在这种情况下我该怎么办?我没有删除任何行。

出于性能原因,将缓存标识值

当SQL Server启动时,它会保留一大块值。如果SQL Server在处理过程中下降,则那些“保留”值将丢失。p> 这就是这里发生的事情——它保留了1000个标识值,然后重新启动或者其他什么——因此下一个标识值不是1,而是比上一个标识值高1000左右

如果这确实是一个问题,您可以在启动时设置跟踪标志
T272
,以恢复SQL Server 2008 R2行为(无缓存)


更详细地解释这一点。

意外的身份增量是隐藏问题的良好指示器。 让我们考虑一下:“回滚事务”总是导致它的增量

请尝试以下操作:

CREATE TABLE table1 (id int identity(1,1), val int)

INSERT INTO table1 (val) VALUES (1)

SELECT * FROM table1 -- one row, id = 1

BEGIN TRANSACTION
INSERT INTO table1 (val) VALUES (2)
INSERT INTO table1 (val) VALUES (3)
INSERT INTO table1 (val) VALUES (4)
INSERT INTO table1 (val) VALUES (5)
INSERT INTO table1 (val) VALUES (6)
INSERT INTO table1 (val) VALUES (7)
INSERT INTO table1 (val) VALUES (8)
INSERT INTO table1 (val) VALUES (9)
ROLLBACK TRANSACTION 

INSERT INTO table1 (val) VALUES (10)

SELECT * FROM table1 -- two rows, id = 10

使用“回滚事务”(可能是“try/catch”块或其他任何东西)检查代码中的错误处理。

,不要再担心间隙-它们真的不是问题@marc_s,那么问题是什么?@Jeeten-问题是您假设标识列的属性(比如没有间隙)实际上无法保证。如果你能把这个假设抛在脑后,接受其中的差距,那么你将来在SQL Server数据库开发方面会有一个更愉快的体验。这有点错误。请参阅会议的备注。“失败的语句和事务可以更改表的当前标识,并在标识列值中创建间隙。即使尝试将标识值插入表中的事务未提交,标识值也不会回滚。例如,如果insert语句因IGNORE_DUP_键冲突而失败,则CURRR”表的ent标识值仍在增加。“这是正常的。