SQLServer2012列标识增量在第7项从6跳到1000 +

我遇到了一个奇怪的场景,SQLServer2012数据库中的 auto Identity int 列没有正确地递增。

假设我有一个使用 int auto 标识作为主键的表,它会偶尔跳过增量,例如:

1, 2, 3, 四, 5, 1004, 1005

这是发生在随机数表在非常随机的时间,无法复制它找到任何趋势。

怎么会这样? 有办法让它停下来吗?

113272 次浏览

这一切都很正常。Microsoft 在 SQLServer2012中添加了 sequences,最后,我可能会添加和更改标识键生成的方式。看看 给你的一些解释。

如果你想保持过去的行为,你可以:

  1. 使用跟踪标志272-这将导致为每个生成的标识值生成一个日志记录。打开这个跟踪标志可能会影响标识生成的性能。
  2. 使用带有 NO 缓存设置(http://msdn.microsoft.com/en-us/library/ff878091.aspx)的序列发生器

遇到了同样的问题,在 SQLServer2012中发现了以下错误报告 如果仍然相关,看看导致问题的条件-也有一些变通方法(没有尝试)。 故障转移或重新启动导致身份重新种子

虽然 trace Flag 272可能对很多人有用,但它肯定不适用于托管的 SQL Server Express 安装。因此,我创建了一个标识表,并通过 INSTEADOF 触发器使用它。我希望这能帮助其他人,或者给其他人一个改进我的解决方案的机会。最后一行允许返回添加的最后一个标识列。由于我通常使用它来添加单个行,因此它可以返回单个插入行的标识。

身份证明表:

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