SQL Server 2012 Express中的标识列问题

时间:2014-08-04 04:16:47

标签: sql sql-server sql-server-2012-express

我正在使用主键将Identity列设置为一个名为UserId的列。所以,它会自动增加。它在我的SQL Server 2008 R2中运行良好。但在某段时间之前,我将其升级到SQL Server 2012。

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

例如最后一个增加的数字是13,所以之后它应该是14但它增加数字直接1008这是13到1007之间的非常大的差距。

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

2 个答案:

答案 0 :(得分:3)

出于性能原因缓存IDENTITY值。

当SQL Server启动时,它会保留一大块值。如果SQL Server在处理过程中出现故障,那么"保留"价值观丢失了。

这里发生了什么 - 它保留了1000个身份值,然后重新启动或其他 - 所以下一个身份值不是1,但比前一个高出大约1000。

如果您真的遇到问题,可以在启动时设置跟踪标记T272以恢复SQL Server 2008 R2行为(无缓存)。

See this CodeProject article更详细地解释了这一点。

答案 1 :(得分:-1)

意外的身份增量是隐藏问题的良好指标。 让我们考虑一下:" ROLLBACK TRANSACTION"总是会导致它的增量。

请尝试以下操作:

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

使用" ROLLBACK TRANSACTION"检查您的代码以进行错误处理。 (也许"尝试/捕捉"阻止或其他)。