我发现 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 将服从您,并尝试从 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>);
关于SQL 插入失败 - 违反主键约束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21168964/