【问题标题】:Why does violation of PRIMARY KEY constraint return error code 2627 not 2601 in SQL Server?为什么在 SQL Server 中违反 PRIMARY KEY 约束返回错误代码 2627 而不是 2601?
【发布时间】:2019-12-03 11:34:27
【问题描述】:

自从Document 指出后,我有一段时间感到困惑:

当您创建 PRIMARY KEY 约束时,唯一的聚集索引 如果聚集索引在 该表尚不存在且您未指定唯一的 非聚集索引。主键列不能允许 NULL 值。

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

我了解到 2601 无法在对象 '%.*ls' 中插入重复的键行,来自 Database Engine Errors 的唯一索引为 '%.*ls'。

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

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

【问题讨论】:

  • 我的猜测是因为该对象被标记为主键,在确定错误代码时似乎比唯一索引具有更高的优先级

标签: sql-server sqlexception


【解决方案1】:

至少在 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 失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    相关资源
    最近更新 更多