IDENTITY 列突然違反 PRIMARY KEY
我有一個
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