SQL Server 2012列标识增量从6跳到1000+;在第七条入口
我有一个奇怪的场景,SQL Server 2012数据库中的auto-identity int列没有正确递增 假设我有一个使用int auto标识作为主键的表,它会偶尔跳过增量,例如: 一,, 2. 3. 4. 5. 1004, 1005 这是在非常随机的时间随机数表上发生的,无法复制它来发现任何趋势 这是怎么发生的?SQL Server 2012列标识增量从6跳到1000+;在第七条入口,sql,sql-server,sql-server-2012,identity,Sql,Sql Server,Sql Server 2012,Identity,我有一个奇怪的场景,SQL Server 2012数据库中的auto-identity int列没有正确递增 假设我有一个使用int auto标识作为主键的表,它会偶尔跳过增量,例如: 一,, 2. 3. 4. 5. 1004, 1005 这是在非常随机的时间随机数表上发生的,无法复制它来发现任何趋势 这是怎么发生的? 有没有办法让它停下来?这完全正常。Microsoft在SQL Server 2012中添加了序列,最后,我可能会添加并更改生成身份密钥的方式。看看有什么解释 如果你想保持老习惯,
有没有办法让它停下来?这完全正常。Microsoft在SQL Server 2012中添加了
序列
,最后,我可能会添加并更改生成身份密钥的方式。看看有什么解释
如果你想保持老习惯,你可以:
遇到相同的问题,在SQL Server 2012中发现以下错误报告 如果仍然相关,请查看导致问题的条件-也有一些解决方法(尽管没有尝试)。
虽然跟踪标志272可能适用于许多人,但它肯定不适用于托管的Sql Server Express安装。因此,我创建了一个标识表,并通过INSTEAD OF触发器使用它。我希望这能帮助其他人,和/或给其他人一个改进我的解决方案的机会。最后一行允许返回添加的最后一个标识列。因为我通常使用它来添加单行,所以它可以返回单个插入行的标识 标识表:
CREATE TABLE [dbo].[tblsysIdentities](
[intTableId] [int] NOT NULL,
[intIdentityLast] [int] NOT NULL,
[strTable] [varchar](100) NOT NULL,
[tsConcurrency] [timestamp] NULL,
CONSTRAINT [PK_tblsysIdentities] PRIMARY KEY CLUSTERED
(
[intTableId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
和插入触发器:
-- INSERT --
IF OBJECT_ID ('dbo.trgtblsysTrackerMessagesIdentity', 'TR') IS NOT NULL
DROP TRIGGER dbo.trgtblsysTrackerMessagesIdentity;
GO
CREATE TRIGGER trgtblsysTrackerMessagesIdentity
ON dbo.tblsysTrackerMessages
INSTEAD OF INSERT AS
BEGIN
DECLARE @intTrackerMessageId INT
DECLARE @intRowCount INT
SET @intRowCount = (SELECT COUNT(*) FROM INSERTED)
SET @intTrackerMessageId = (SELECT intIdentityLast FROM tblsysIdentities WHERE intTableId=1)
UPDATE tblsysIdentities SET intIdentityLast = @intTrackerMessageId + @intRowCount WHERE intTableId=1
INSERT INTO tblsysTrackerMessages(
[intTrackerMessageId],
[intTrackerId],
[strMessage],
[intTrackerMessageTypeId],
[datCreated],
[strCreatedBy])
SELECT @intTrackerMessageId + ROW_NUMBER() OVER (ORDER BY [datCreated]) AS [intTrackerMessageId],
[intTrackerId],
[strMessage],
[intTrackerMessageTypeId],
[datCreated],
[strCreatedBy] FROM INSERTED;
SELECT TOP 1 @intTrackerMessageId + @intRowCount FROM INSERTED;
END
不要期望标识值密集。例如,插入一行时的回滚将导致标识值被“消耗”,在数字中留下一个空白。我知道(例如插入一条失败的记录)标识中的下一个数字将被使用并丢失,如果在一条语句中插入2000条记录,当其跳过1000条时会稍微发出警报,如果第1000次失败,您将从序列中损失1000。我曾经在一笔交易中损失了100000英镑。要么阻止所有插入,直到事务提交。这到底是什么。我们也开始经历同样的情况,它正在破坏我们的数据管理方式。虽然了解Sql Server 2012现在的工作方式非常有帮助,但这是一个真正的问题。建议的解决方案对我不起作用,因为我无法访问托管的Sql Server Express服务器。我也不能简单地使用序列生成器,因为我需要连续的数字——比如说,对于不能接受跳1000的发票,或者在多个表中递增数字将不起作用。另外,我可能会从Microsoft access前端添加行,因此我不能只更新INSERT语句来处理此问题。我正在考虑在插入后触发器中更新非主键。有更好的主意吗?在intsI用完之前,这是完全正常的,因为有一个增量设置为42的“传统”标识列。列值增加了41706(eek!),正好是993*42@Simon_Weaver您多长时间重新启动一次sql server?我已经运行了一年多的实例,没有一个序列问题。我们从未重新启动服务器,序列跳了!!有了这样的“功能”,谁需要bug?