Sql-Server

IDENTITY 列突然違反 PRIMARY KEY

  • October 19, 2016

我有一個log帶有ID標識列的表。多年來一切正常;然後,昨天,我在日誌中看到以下錯誤:

該語句已終止。

違反主鍵約束“PK__log__ID__3B40CD36”。無法在對象“dbo.log”中插入重複鍵。重複鍵值為 (295992)。

插入日誌(日期、時間、使用者、模組、過程、程式碼、行、bez1、bez2、tech_info)值(‘20151126 00:00:00.000’、‘19000101 18:26:45.121’、‘客戶’、’’ , ‘’, ‘WShop-Trans’, 0, ‘為表地址發送1條記錄。’, ‘’, ‘’)

我檢查了 IDENTITY 種子,它看起來不錯:

查詢:DBCC CHECKIDENT(日誌)

結果:檢查身份資訊:目前身份值“296021”,目前列值“296021”。

DBCC 執行完成。如果 DBCC 列印錯誤消息,請聯繫您的系統管理員。

查詢:SELECT MAX(ID) FROM log

結果:296021

表上沒有觸發器,也沒有人在弄亂種子值(我是管理數據庫伺服器的人,所以我很確定)。

到目前為止,這是一次性事件,我無法重現它。

我看起來只是一個 SQL Server 故障,但我很好奇:這是一個已知的錯誤,還是對此有任何其他合理的解釋?SQL Server 版本是Microsoft SQL Server 2012 - 11.0.2100.60 (X64).

為了完整起見,這是完整的表格腳本:

CREATE TABLE [log](
   [datum] [datetime] NULL,
   [ID] [int] IDENTITY(1,1) NOT NULL,
   [zeit] [datetime] NULL,
   [benutzer] [varchar](255) NULL,
   [modul] [varchar](255) NULL,
   [prozedur] [varchar](255) NULL,
   [code] [varchar](255) NULL,
   [zeile] [int] NULL,
   [bez1] [text] NULL,
   [bez2] [text] NULL,
   [tech_info] [text] NULL,
   [pc_name] [varchar](255) NULL,
   [app_name] [varchar](255) NULL,
   [s_insert_user] [nvarchar](255) NULL,
   [s_insert_dat] [datetime] NULL,
   [s_update_user] [nvarchar](255) NULL,
   [s_update_dat] [datetime] NULL,
   [fs_mandant] [uniqueidentifier] NULL,
CONSTRAINT [PK__log__ID__3B40CD36] PRIMARY KEY CLUSTERED ([ID] ASC)
)

CREATE NONCLUSTERED INDEX [code] ON [log] ([code] ASC)
CREATE NONCLUSTERED INDEX [datum_zeit] ON [log] ([datum] ASC, [zeit] ASC)
CREATE NONCLUSTERED INDEX [fs_mandant] ON [log] ([fs_mandant] ASC)
CREATE NONCLUSTERED INDEX [modul] ON [log] ([modul] ASC)

由於問題表明正在使用 SQL Server 2012 RTM(內部版本 2100),因此很可能是這個錯誤:

修復:當 SQL Server 2012 或 SQL Server 2014 處於記憶體壓力之下時,序列對像生成重複的序列值

其中說:

假設您創建的序列對像CACHE在 Microsoft SQL Server 2012 或 SQL Server 2014 中啟用了該選項。當實例處於記憶體壓力下,並且多個並發連接從同一序列對象請求序列值時,可能會生成重複的序列值。此外,將重複序列值插入表中時,會發生唯一鍵或主鍵 (PK) 衝突錯誤。

請注意,IDENTITY在 SQL Server 2012 及更高版本中使用序列對像機制。

該問題首先在以下位置修復:

  • SQL Server 2014 的累積更新 6
  • SQL Server 2012 SP2 的累積更新 4

引用自:https://dba.stackexchange.com/questions/122254