由于重复不存在而无法创建索引?

时间:2010-02-01 23:28:33

标签: sql-server-2005 tsql indexing unique-index

运行以下Transact-SQL命令时出错:

CREATE UNIQUE NONCLUSTERED INDEX IX_TopicShortName
ON DimMeasureTopic(TopicShortName)

错误是:

  

Msg 1505,Level 16,State 1,Line 1   CREATE UNIQUE INDEX语句   终止,因为重复的密钥是   找到对象名称   'dbo.DimMeasureTopic'和索引   名称'IX_TopicShortName'。该   重复键值为()。

当我运行SELECT * FROM sys.indexes WHERE name = 'IX_TopicShortName'SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[DimMeasureTopic]')时,不会显示IX_TopicShortName索引。所以似乎没有重复。

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

5 个答案:

答案 0 :(得分:86)

索引不存在,但表中的TopicShortName字段有重复值。根据错误消息,重复值是一个空字符串(它可能只是发布的一个方面我猜)。此类重复项会阻止创建UNIQUE索引。

您可以运行查询以确认您有重复:

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

据推测,在其他数据库中,数据不同,并且不存在重复数据。

答案 1 :(得分:12)

副本位于您的数据中,请尝试运行此查询以查找它。

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

答案 2 :(得分:5)

这是因为你的表中的记录已经不是唯一的(通过它的声音,在TopicShortName字段中有2个空白值的记录)。

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

答案 3 :(得分:3)

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

答案 4 :(得分:0)

它应该已经在错误消息中指定了重复的键值。 “重复的键值为('','','')语句已终止。您有重复的值需要解决。