我有一个奇怪的场景,其中我的 SQL Server 2012 数据库中的 auto identity int 列没有正确增加。
假设我有一个使用 int 自动标识作为主键的表,它偶尔会跳过增量,例如:
1、2、3、4、5、1004、1005
这是在非常随机的时间随机数量的表上发生的,无法复制它以找到任何趋势。
这是怎么回事?有没有办法让它停止?
我有一个奇怪的场景,其中我的 SQL Server 2012 数据库中的 auto identity int 列没有正确增加。
假设我有一个使用 int 自动标识作为主键的表,它偶尔会跳过增量,例如:
1、2、3、4、5、1004、1005
这是在非常随机的时间随机数量的表上发生的,无法复制它以找到任何趋势。
这是怎么回事?有没有办法让它停止?
这一切都很正常。Microsoftsequences
在 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