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

2024-01-19

自从那之后我有一段时间很困惑Document https://learn.microsoft.com/zh-tw/sql/relational-databases/indexes/create-unique-indexes?view=sql-server-2017指出:

当您创建 PRIMARY KEY 约束时,唯一聚集索引 如果有聚集索引,则会自动创建一个或多个列 该表尚不存在并且您没有指定唯一的 非聚集索引。主键列不能允许 NULL 值。

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

我了解到 2601 无法在具有唯一索引 '%.*ls' 的对象 '%.*ls' 中插入重复的键行数据库引擎错误 https://learn.microsoft.com/en-us/sql/relational-databases/errors-events/database-engine-events-and-errors?view=sql-server-2017.

我的问题是,当我尝试将主键列中的重复值插入主键上具有唯一聚集索引的表时,为什么 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。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 SQL Server 中违反 PRIMARY KEY 约束会返回错误代码 2627 而不是 2601? 的相关文章

随机推荐