2014-01-16 65 views
3

我看到有一个SQL INSERT语句一个很奇怪的问题,我有一个简单的表,有ID和2个日期时间,请参阅下面创建脚本 -SQL插入失败 - 主键约束违反

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). 

上面的错误消息中的重复键值在每次执行插入时都会增加,所以它似乎知道它是一个标识列。

什么会导致此问题?

在此先感谢。 西蒙

编辑

我现在已经创建了此表的副本,可以插入到新表细使用脚本,这可能是导致其失败?

+1

你已经有一排ID 11.你是否重新加入了标识列,以便从1重新开始? –

+0

该表已经包含1000行,我没有重播任何东西,只是想知道为什么会发生这种情况,好像下面的答案 – user1948635

回答

9

可能是有人发表DBCC CHECKIDENT对阵表。当你这样做的时候,SQL Server会服从你,并且试图从RESEED开始产生值,然后递增。它不首先检查这些值是否已经存在(即使有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>); 
+0

ReSeed做了这个把戏,谢谢。当它允许我也会标记为答案... – user1948635