【问题标题】:Unable to create index because of duplicate that doesn't exist?由于不存在的重复项而无法创建索引?
【发布时间】:2011-01-11 22:58:22
【问题描述】:

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

CREATE UNIQUE NONCLUSTERED INDEX IX_TopicShortName
ON DimMeasureTopic(TopicShortName)

错误是:

消息 1505,第 16 级,状态 1,第 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 索引。所以似乎没有重复。

我在另一个数据库中具有相同的架构,并且可以在那里创建索引而不会出现问题。任何想法为什么它不会在这里创建?

【问题讨论】:

  • 在进行有人更新时运行的迁移时遇到了同样的问题。我解决了这个问题,首先检查重复项并删除它们,然后检查 INDEX 是否存在以及是否不创建它。

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


【解决方案1】:

它应该在错误消息中指定了重复的键值。 "重复键值是 (' ', ' ', ' ') 语句已终止。您有重复值需要处理。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

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

          可能在另一个数据库中数据不同,并且不存在重复项。

          【讨论】:

          • 这是我 3 次在谷歌上搜索此错误并最终出现在这里,非常感谢。另外为了将来参考,我正在添加代码以删除重复项。希望这没问题 从 DimMeasureTopic 中删除 ID 不在(从 DimMeasureTopic GROUP BY TopicShortName 中选择 MAX(ID))
          猜你喜欢
          • 2022-10-14
          • 1970-01-01
          • 2015-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多