[英]SQL Insert Failing - Violation of Primary Key Constraint
我看到一個SQL Insert語句的一個非常奇怪的問題,我有一個簡單的表,ID和2個日期時間,請參閱下面的創建腳本 -
CREATE TABLE [dbo].[DATA_POPULATION_LOGS](
[ID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[START] [datetime] NOT NULL,
[FINISH] [datetime] NOT NULL,
CONSTRAINT [PK__DATA_POP__3214EC2705D8E0BE] PRIMARY KEY CLUSTERED
(
[ID] 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 INTO [dbo].[DATA_POPULATION_LOGS]
([START]
,[FINISH])
VALUES
(GETDATE()
,GETDATE())
它失敗了,出現以下錯誤 -
Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK__DATA_POP__3214EC2705D8E0BE'. Cannot insert duplicate key in object 'dbo.DATA_POPULATION_LOGS'. The duplicate key value is (11).
每次執行插入時,上面的錯誤消息中的重復鍵值都會增加,因此它似乎知道它是一個標識列。
會導致這個問題的原因是什么?!
提前致謝。 西蒙
編輯
我現在已經創建了這個表的副本,可以使用該腳本插入到新表中,可能導致它失敗的原因是什么?
可能有人對該表發出了DBCC CHECKIDENT
。 執行此操作時,SQL Server將服從您,並嘗試從RESEED
開始生成值RESEED
增量遞增。 它不首先檢查這些值是否已經存在(即使存在PK)。 生成相同錯誤的簡單repro:
USE tempdb;
GO
CREATE TABLE dbo.floob(ID INT IDENTITY(1,1) PRIMARY KEY);
GO
INSERT dbo.floob DEFAULT VALUES;
GO
DBCC CHECKIDENT('dbo.floob', RESEED, 0);
GO
INSERT dbo.floob DEFAULT VALUES;
GO
DROP TABLE dbo.floob;
要阻止這種情況發生,您可以找出現在的最大值,然后再次運行CHECKIDENT
:
DBCC CHECKIDENT('dbo.tablename', RESEED, <max value + 10 or 20 or something here>);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.