为什么违反主键约束在 SQL Server 中返回错误代码 2627 而不是 2601?



自从文档指出以来,我感到困惑了一段时间:

创建主键约束时,唯一的聚集索引 如果聚集索引位于 该表尚不存在,并且您未指定唯一的 非聚集索引。主键列不允许空值。

我在SQL服务器中有一个带有PRIMARY KEY约束的表。根据上述观点,由于我没有在表中创建任何聚集索引,因此会自动在列或列上创建一个唯一的聚集索引。

我了解到 2601 无法在对象"%.*ls"中插入重复的键行,唯一索引为"%.*ls"来自数据库引擎错误。

我的问题是,当我尝试在主键上具有唯一聚集索引的主键列中插入重复值时,为什么 SQL Server 返回错误代码 2627 而不是 2601? 是因为 2627 的优先级高于 2601 还是什么?

有人可以给我一些建议或帮助吗?谢谢。

至少在SQL Server 上,主键是一种约束类型。因此,当您创建主键时,它既是(唯一)索引又是约束。错误 2627 和 2601 具有相同的严重性,因此 SQL Server 似乎将返回更高的错误代码(因为违反了唯一索引和约束)。

在测试中,您只会收到错误 2601,即列具有违反的唯一索引,但没有约束。因此,您很可能会在条件唯一索引上看到这一点。

举个例子:

USE Sandbox;
GO
--First sample table with primary key (Clustered)
CREATE TABLE dbo.TestTable1 (ID int PRIMARY KEY);
GO
--inserts fine
INSERT INTO dbo.TestTable1
VALUES(1);
GO
--Errors with code 2627
INSERT INTO dbo.TestTable1
VALUES(1);
GO
--Create second sample table, with unique Constraint
CREATE TABLE dbo.TestTable2(ID int,
CONSTRAINT U_ID UNIQUE(ID));
GO
--Inserts fine
INSERT INTO dbo.TestTable2
VALUES(1);
GO
--Errors with code 2627
INSERT INTO dbo.TestTable2
VALUES(1);
GO
--Create third sample table
CREATE TABLE dbo.TestTable3(ID int);
--Create unique index, without Constraint
CREATE UNIQUE INDEX ID_UX ON dbo.TestTable3(ID);
GO
--Inserts fine
INSERT INTO dbo.TestTable3
VALUES(1);
GO
--Errors with code 2601
INSERT INTO dbo.TestTable3
VALUES(1);
GO
--Clean up
DROP TABLE dbo.TestTable1
DROP TABLE dbo.TestTable2
DROP TABLE dbo.TestTable3

请注意,只有最后一个插入失败并出现错误 2601;其他 2 个插入失败并出现 2627。

相关内容

最新更新