因为不存在的重复项无法创建索引?

65

我在运行以下Transact-SQL命令时遇到了错误:

CREATE UNIQUE NONCLUSTERED INDEX IX_TopicShortName
ON DimMeasureTopic(TopicShortName)

错误信息如下:

Msg 1505,Level 16,State 1,Line 1 由于在对象名 'dbo.DimMeasureTopic' 和索引名称 'IX_TopicShortName' 中发现重复的键值(),因此无法执行 CREATE UNIQUE INDEX 语句。

当我运行 SELECT * FROM sys.indexes WHERE name = 'IX_TopicShortName'SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[DimMeasureTopic]') 时,并未显示出 IX_TopicShortName 索引。因此似乎不存在重复项。

我在另一个数据库中拥有相同的模式,并且可以在那里创建索引而没有任何问题。有什么想法为什么它在这里无法创建呢?


在进行一个在某人更新时运行的迁移时,我遇到了同样的问题。我通过首先检查重复项并删除它们,然后检查索引是否存在,如果不存在则创建它来解决这个问题。 - Robert
5个回答

119

问题并不在于索引已经存在,而是表中 TopicShortName 字段存在重复值。根据错误信息,这个重复值是一个空字符串 (我猜可能只是发布的一部分)。这样的重复值会阻止创建一个 UNIQUE 索引。

您可以运行一个查询来确认是否存在重复值:

SELECT
    TopicShortName,
    COUNT(*)
FROM
    DimMeasureTopic
GROUP BY
    TopicShortName
HAVING
    COUNT(*) > 1

假设在另一个数据库中数据不同,因此重复数据不存在。


1
这已经是我第三次谷歌这个错误并最终跳到这里,感谢您的帮助。另外,为了将来的参考,我添加了删除重复项的代码。希望这样做没问题。DELETE FROM DimMeasureTopic WHERE ID NOT IN (SELECT MAX(ID) FROM DimMeasureTopic GROUP BY TopicShortName) - Dowlers

16

重复数据存在于您的数据中,请尝试运行此查询以查找它。

SELECT TopicShortName, COUNT(*)
FROM DimMeasureTopic
GROUP BY TopicShortName
HAVING COUNT(*) > 1

7

这是因为您在表中已经有了非唯一的记录(听起来是两个TopicShortName字段为空的记录)。

所以,这与索引本身无关,而与数据有关。


5

如果你正在使用基于代码的迁移,并且重命名实体的属性,而该属性有唯一索引,则实体框架会创建一个新列并尝试为该新列添加唯一索引,但是新列具有所有空值,因此将失败。你需要手动修改迁移代码,在创建索引之前复制旧列中的数据。


0

错误信息应该指定重复键值。"重复的键值为(' ', ' ', ' '),语句已终止。您需要解决重复值问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接