【问题标题】:IDENT_CURRENT returning less value than MAX(ID)IDENT_CURRENT 返回的值小于 MAX(ID)
【发布时间】:2016-11-18 19:34:34
【问题描述】:

我有一张这样的桌子:

CREATE TABLE [dbo].[RequestQueue]
(
    [QueueID] [BIGINT] IDENTITY(1,1) NOT NULL,
    [EntryDate] [DATETIME] NULL 
         CONSTRAINT [DF_SecurityQueue_EntryDate]  DEFAULT (GETDATE()),
    [AsOfDate] [DATE] NULL,
    [ItemID] [VARCHAR](32) NULL,
    [ItemType] [VARCHAR](50) NULL,
    [Message] [VARCHAR](MAX) NULL,

     CONSTRAINT [PK_QueueID] 
        PRIMARY KEY CLUSTERED ([QueueID] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

我有一个每天运行的SQL作业,往这个表中插入数据,插入语句是这样的:

INSERT INTO dbo.RequestQueue( AsOfDate , ItemID , ItemType )
VALUES  ( GETDATE(),'ABC1','TYPE1' )

这项日常工作运行了一年多,直到昨晚它中断并显示以下消息:

消息 2627,第 14 级,状态 1,第 25 行
违反主键约束“PK_QueueID”。无法在对象“dbo.RequestQueue”中插入重复键。重复键值为 (1698922)。

我检查了身份值如下:

SELECT IDENT_CURRENT('dbo.RequestQueue')

返回 1698922

SELECT MAX([QueueID]) 
FROM [dbo].[RequestQueue]

返回 1699269

IDENT_CURRENT 出了什么问题?

SQL 作业按每日计划运行,每天运行一次。

RequestQueue 表有一些并发读取器,它们也会发出更新语句,但当然不会在 PK 列上。

在其他任何地方都没有其他插入作业/进程。

【问题讨论】:

  • 会不会是用户手动插入记录?
  • 没有手动插入,也没有其他自动化过程。此表位于业务敏感数据库上,有多层控制可防止手动数据操作。
  • 表上是否有插入触发器?
  • 您的身份似乎因隔离级别而被卡住 - 代码运行在什么隔离级别 - 未提交读取?
  • 读取已提交。

标签: sql sql-server tsql


【解决方案1】:

看起来您的表格有时会使用以下命令重新播种

DBCC CHECKIDENT (YourTable, RESEED, 999)

【讨论】:

  • 谢谢卡南。它看起来确实像重新播种,但我有充分的理由相信没有手动执行此类命令或任何数据操作命令。会不会是并发进程更新了表中的消息列?
猜你喜欢
  • 2013-10-31
  • 1970-01-01
  • 2013-08-18
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多