簡體   English   中英

SQL插入失敗 - 違反主鍵約束

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM