SQL Server 2012列标识增量在第7个条目上从6跳至1000+。

20 浏览
0 Comments

SQL Server 2012列标识增量在第7个条目上从6跳至1000+。

我在我的SQL Server 2012数据库中遇到了一个奇怪的情况,自动递增的int列没有正确递增。

假设我有一个表,它使用int自动递增作为主键,它偶尔会跳过递增,例如:

1,

2,

3,

4,

5,

1004,

1005

这种情况在随机数量的表中以非常随机的时间发生,无法复制以找到任何趋势。

为什么会发生这种情况?

有没有办法让它停止?

0
0 Comments

问题原因:SQL Server 2012中,列的自增值在第7个记录时跳跃至1000+。

解决方法:使用一个identity表和INSTEAD OF触发器来解决该问题。触发器中的最后一行代码用于返回最后一个插入的自增列的值。

以下为解决方案中使用的identity表和插入触发器的代码:

-- 创建identity表
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]
-- 创建插入触发器
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 @RowCount INT
    DECLARE @LastIdentity INT
    SET @RowCount = (SELECT COUNT(*) FROM INSERTED)
    SET @LastIdentity = (SELECT intIdentityLast FROM tblsysIdentities WHERE intTableId=1)
    UPDATE tblsysIdentities SET intIdentityLast = @LastIdentity + @RowCount WHERE intTableId=1
    INSERT INTO tblsysTrackerMessages( 
        [intTrackerMessageId],
        [intTrackerId],
        [strMessage],
        [intTrackerMessageTypeId],
        [datCreated],
        [strCreatedBy])
    SELECT @LastIdentity + ROW_NUMBER() OVER (ORDER BY [datCreated]) AS [intTrackerMessageId], 
        [intTrackerId],
        [strMessage],
        [intTrackerMessageTypeId],
        [datCreated],
        [strCreatedBy] FROM INSERTED;
    SELECT TOP 1 @LastIdentity + @RowCount FROM INSERTED;
END

希望这个解决方案能帮助其他人,并且给其他人改进我的解决方案的机会。

0
0 Comments

问题的原因是在SQL Server 2012中,微软引入了sequences,并改变了identity键的生成方式。具体解决方法如下:

1. 使用跟踪标志272,这会导致每个生成的identity值都生成一个日志记录。打开这个跟踪标志可能会影响identity生成的性能。

2. 使用NO CACHE设置的sequence生成器。

以上两种方法都可以恢复旧的行为。

然而,使用sequences也会带来一些问题。sequence号码是在当前事务范围之外生成的,无论使用sequence号码的事务是提交还是回滚,都会消耗掉该号码。

0
0 Comments

在SQL Server 2012中,有一个关于列自增的错误报告。如果仍然相关,请查看导致该问题的条件-那里还有一些解决方法(尽管没有尝试过)。

问题的原因是,在SQL Server 2012中,当执行故障转移或重启操作时,列自增的增量可能会出现跳跃。这意味着,当数据库重新启动后,列自增的下一个值可能会从之前的值(如6)跳至1000+。这可能会导致数据不一致,并且可能会破坏应用程序的预期行为。

解决这个问题的方法是在SQL Server 2012中应用以下补丁:

1. 打开Microsoft官方网站的SQL Server 2012下载页面。

2. 搜索适用于SQL Server 2012的最新累积更新补丁。

3. 下载并安装适用于SQL Server 2012的最新累积更新补丁。

4. 在安装补丁后,重新启动数据库服务器以应用更改。

请注意,补丁的安装可能需要一些时间,并且可能需要重新启动数据库服务器。因此,在应用补丁之前,请确保在非生产环境中进行测试,并确保备份数据库以防万一。

通过安装最新的累积更新补丁,应该能够解决SQL Server 2012中列自增增量跳跃的问题。这将确保列自增的连续性,并避免数据不一致的问题。

希望这篇文章对解决SQL Server 2012中列自增增量跳跃的问题有所帮助。如果遇到此问题,请按照提供的解决方法进行操作,并确保及时更新补丁以保持数据库的稳定性和一致性。

0