Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在标识列上生成无序序列号_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 在标识列上生成无序序列号

Sql 在标识列上生成无序序列号,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我的一个SQL Server出现了一个奇怪的问题。我在seqid列中插入了一个Identity,其中某个时间点它增加了2个而不是1。我的标识增量设置是1而不是2。标识列有什么问题?标识值不保证连续。由于回滚、删除等原因,您可能会丢失数字 CREATE TABLE #d(ID INT IDENTITY(1,1)); INSERT #d DEFAULT VALUES; BEGIN TRANSACTION; INSERT #d DEFAULT VALUES; ROLLBACK TRANSACTIO

我的一个SQL Server出现了一个奇怪的问题。我在
seq
id
列中插入了一个
Identity
,其中某个时间点它
增加了
2个而不是
1
。我的标识增量设置是1而不是2。
标识
列有什么问题?

标识值不保证连续。由于回滚、删除等原因,您可能会丢失数字

CREATE TABLE #d(ID INT IDENTITY(1,1));

INSERT #d DEFAULT VALUES;

BEGIN TRANSACTION;
INSERT #d DEFAULT VALUES;
ROLLBACK TRANSACTION;

INSERT #d DEFAULT VALUES;

SELECT ID FROM #d;

DROP TABLE #d;
结果:

ID
----
1
3

如果需要值是连续的,停止使用标识列。

这是因为您有一些未提交的插入,因此这些插入的标识将被计数。

是一直在发生这种情况,还是您只是在某个地方丢失了一个值?发生这种情况可能是因为您运行了失败的语句或回滚了事务。它发生的次数很少,指一周一次的罕见病例likewise@DanBracuk:我给出的消息基于最大标识加上一,在逻辑上,我假设下一个数字将是上一个标识的增量。但是,在某些情况下,由于身份序列的无序性。我得到了错误的结果停止使用MAX()+1告诉他们得到了什么ID。插入值后使用SCOPE_IDENTITY()。有什么方法可以防止这种情况发生吗?@Smaug可以防止出现间隙?不,没有标识列。考虑一个序列化的最大()(1),但是如果稍后删除行,这仍然会留下空隙。在我的应用程序中有很多并发用户。如果使用max()+1,则可能会出现重复值。我该如何处理这种情况?@Smaug这就是为什么您使用
SERIALIZABLE
。我该如何避免这些情况?如果发生这种情况,您应该小心,然后使用DBCC CHECKIDENT(表名[,{NORESEED{RESEED[,new_RESEED_value]}])[不带任何信息msgs]重新设定到特定点。