Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server 2012列标识增量从6跳到1000+;在第七条入口_Sql_Sql Server_Sql Server 2012_Identity - Fatal编程技术网

SQL Server 2012列标识增量从6跳到1000+;在第七条入口

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中添加了序列,最后,我可能会添加并更改生成身份密钥的方式。看看有什么解释 如果你想保持老习惯,

我有一个奇怪的场景,SQL Server 2012数据库中的auto-identity int列没有正确递增

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

一,, 2. 3. 4. 5. 1004, 1005

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

这是怎么发生的?
有没有办法让它停下来?

这完全正常。Microsoft在SQL Server 2012中添加了
序列
,最后,我可能会添加并更改生成身份密钥的方式。看看有什么解释

如果你想保持老习惯,你可以:

  • 使用跟踪标志272-这将导致为每个生成的标识值生成日志记录。打开此跟踪标志可能会影响标识生成的性能
  • 使用无缓存设置的序列生成器()

  • 遇到相同的问题,在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?