MSSQLSERVER_1505

适用范围:SQL Server

详细信息

Attribute
产品名称 SQL Server
事件 ID 1505
事件来源 MSSQLSERVER
组件 SQLEngine
符号名称 DUP_KEY
消息正文 CREATE UNIQUE INDEX 已终止,因为找到了对象名称 '%.*ls' 和索引名称 '%.*ls' 的重复键。 重复的键值为 %ls。

说明

如果表中有多行包含指定的重复值,那么,当您尝试创建唯一索引时,会发生此错误。 当您创建索引并指定 UNIQUE 关键字时,或者当您创建 UNIQUE 约束时,会创建唯一索引。 对于表内的任何行,索引或约束中所定义的列中都不能有重复值。

请考虑以下 Employee 表中的数据:

姓氏 名字 JobTitle HireDate
Walters Rob Senior Tool Designer 2004-11-19
褐色 Kevin 市场助理 Null
褐色 Jo Design Engineer Null
Walters Rob Tool Designer 2001-08-09

由于行中存在重复值,因此不能针对 LastName 列或 LastName 列与 FirstName 列的组合创建唯一索引。

HireDate 列中可能存在不太明显的唯一性冲突。 为了利于创建索引,NULL 值与 NULL 值的比较结果为相等。 因此,如果不止一行中的键值为 NULL,则不能创建唯一索引或唯一约束。 有了上面的数据,不能针对 HireDate 列或 LastName 列与 HireDate 列的组合创建唯一索引。

错误消息 1505 返回第一个违反唯一性约束的行。 该表中可能存在其他重复行。 若要查找所有的重复行,请查询指定的表,然后使用 GROUP BY 和 HAVING 子句报告重复行。 例如,下面的查询返回 Employee 表中具有重复名字和姓氏的行:

SELECT LastName, FirstName, count\ FROM dbo.Employee GROUP BY LastName, FirstName HAVING count\ > 1;

用户操作

请考虑以下解决方案。

  • 在索引或约束定义中添加或删除列以创建唯一组合。 在前面的例子中,向索引或约束定义中添加 MiddleName 列可以解决重复问题。

  • 当为唯一索引或唯一约束选择列时,请选择那些定义为 NOT NULL 的列。 这样,当多行的键值包含 NULL 时,就消除了导致唯一性冲突的可能性。

  • 如果重复值是因数据输入错误而引起的,则可以先手动更正数据,然后创建索引或约束。 有关删除表中重复行的信息,请查看 从 SQL Server 表中删除重复行。

另请参阅

CREATE INDEX (Transact-SQL)
创建唯一索引
创建唯一约束