为什么违反 PRIMARY KEY 约束 return 错误代码 2627 而不是 SQL 服务器中的 2601?

Why does violation of PRIMARY KEY constraint return error code 2627 not 2601 in SQL Server?

自从 Document 指出:

后我一时糊涂了

When you create a PRIMARY KEY constraint, a unique clustered index on the column or columns is automatically created if a clustered index on the table does not already exist and you do not specify a unique nonclustered index. The primary key column cannot allow NULL values.

我在 SQL 服务器中有一个 table 具有 PRIMARY KEY 约束。根据以上几点,由于我没有在 table.

中创建任何聚集,因此自动创建了一个或多个列的唯一聚集索引

我从 Database Engine Errors.

了解到 2601 无法在具有唯一索引“%.*ls”的对象“%.*ls”中插入重复键行

我的问题是,为什么 SQL 服务器 return 错误代码是 2627 而不是 2601,当我尝试将主键列中的重复值插入到具有唯一集群的 table 中时主键上的索引?是因为 2627 的优先级高于 2601 还是什么?

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

主键,至少在 SQL 服务器上,是一种约束。因此,当您创建主键时,它既是(唯一的)索引又是约束。错误 2627 和 2601 具有相同的严重性,因此看起来 SQL 服务器将 return 更高的错误代码(因为违反了唯一索引和约束)。

根据测试,您只会收到错误 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 失败。