SQL插入失败-违反主键约束

SQL插入失败-违反主键约束,sql,sql-server,tsql,Sql,Sql Server,Tsql,我看到一个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__DA

我看到一个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).
上述错误消息中的重复键值在每次执行insert时都会增加,因此它似乎知道这是一个标识列

是什么导致了这个问题

提前谢谢。 西蒙

编辑


我现在已经创建了该表的一个副本,可以使用该脚本将其插入到新表中,是什么导致它失败?

可能有人对该表发出了
DBCC CHECKIDENT
。当您执行此操作时,SQL Server将服从您的命令,并尝试从重新设定的
开始生成值,然后按增量递增。它不会首先检查这些值是否已经存在(即使存在PK)。产生相同错误的简单复制:

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>);
DBCC CHECKIDENT('dbo.tablename',重新设定种子,);

您已经有一个id为11的行。您是否已为identity列重新设定种子,使其从1开始?该表已包含1000行,我没有重新设定任何种子,只是想知道为什么会发生这种情况,下面的答案似乎是这样的