MSSQLSERVER_1505
新建日期: 2008 年 11 月 17 日
详细信息
产品名称 |
SQL Server |
产品版本 |
9.0 |
产品内部版本号 |
9.00.1399.60 |
事件 ID |
1505 |
事件源 |
MSSQLSERVER |
组件 |
SQLEngine |
符号名称 |
|
消息正文 |
因为发现对象名称 '%.*ls' 和索引名称 '%.*ls' 有重复的键,所以 CREATE UNIQUE INDEX 语句终止。重复的键值为 %ls。 |
解释
如果表中有多行包含指定的重复值,那么,当您尝试创建唯一索引时,会发生此错误。当您创建索引并指定 UNIQUE 关键字时,或者当您创建 UNIQUE 约束时,会创建唯一索引。对于表内的任何行,索引或约束中所定义的列中都不能有重复值。
请考虑以下 Employee 表中的数据:
LastName | FirstName | JobTitle | HireDate |
---|---|---|---|
Walters |
Rob |
Senior Tool Designer |
2004-11-19 |
Brown |
Kevin |
Marketing Assistant |
NULL |
Brown |
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 时,就消除了导致唯一性冲突的可能性。
- 如果重复值是因数据输入错误而引起的,则可以先手动更正数据,然后创建索引或约束。有关在表中删除重复行的信息,请参阅知识库文章 139444:如何删除 SQL Server 表中的重复行。
请参阅
其他资源
CREATE INDEX (Transact-SQL)
创建唯一索引
如何创建唯一约束 (Visual Database Tools)
创建和修改 UNIQUE 约束