我在SQL Server 2012数据库中有一个奇怪的情况,auto identity int列没有正确递增。
假设我有一个表,使用int auto identity作为主键,它会间歇性地跳过递增,例如:
1、2、3、4、5、1004、1005
这种情况会在随机数量的表中以非常随机的时间发生,无法复制以查找任何趋势。
是什么导致了这种情况? 有没有办法让它停止?
我在SQL Server 2012数据库中有一个奇怪的情况,auto identity int列没有正确递增。
假设我有一个表,使用int auto identity作为主键,它会间歇性地跳过递增,例如:
1、2、3、4、5、1004、1005
这种情况会在随机数量的表中以非常随机的时间发生,无法复制以查找任何趋势。
是什么导致了这种情况? 有没有办法让它停止?
这是非常正常的。Microsoft在SQL Server 2012中添加了序列(sequences)
,而且还改变了标识键的生成方式。在此参考一下。
如果你想要旧的行为,可以:
我遇到了相同的问题,在 SQL Server 2012 找到以下错误报告。 如果仍然相关,请查看导致此问题的条件-那里还有一些解决方法(尽管没有试过)。 故障转移或重启导致标识重新种植
身份表:
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