2010-02-01 1 views
34

Я получаю сообщение об ошибке, выполнив следующую команду Transact-SQL:Не удалось создать индекс из-за дубликата, которого не существует?

CREATE UNIQUE NONCLUSTERED INDEX IX_TopicShortName 
ON DimMeasureTopic(TopicShortName) 

Ошибка является:

Msg 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 не отображается. Таким образом, похоже, что это не дубликат.

У меня такая же схема в другой базе данных и вы можете создать индекс без проблем. Любые идеи, почему это не будет создано здесь?

ответ

69

Это не значит, что индекс уже существует, но в таблице есть повторяющиеся значения поля TopicShortName. В соответствии с сообщением об ошибке дублирующее значение представляет собой пустую строку (это может быть просто фасет сообщения, который я предполагаю). Такие дубликаты препятствуют созданию индекса UNIQUE.

Вы можете выполнить запрос, чтобы подтвердить, что у вас есть дубликат:

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

Предположительно в другой базе данных данные различны, и дублирует нет.

+1

Это 3 раза, когда я пропустил эту ошибку и оказался здесь так благодарен. Также для дальнейшего использования я добавляю код для удаления дубликатов. Надеюсь, что это нормально УДАЛИТЬ ОТ DimMeasureTopic WHERE ID NOT IN ( SELECT MAX (ID) ОТ DimMeasureTopic GROUP BY TopicShortName) – Dowlers

+0

Вы спасатель – Yiping

+0

бы я до голосую за это каждый раз, когда он спас меня от ума потому что я не понимаю, что сообщение об ошибке! – Vaccano

11

Дубликат в ваших данных, попробуйте выполнить этот запрос, чтобы найти его.

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

Это потому, что у вас есть записи в таблице уже, что не являются уникальными (звуками него, 2 записи с пустым значением в поле TopicShortName).

Таким образом, это связано с данными, а не с самим индексом.

2

Если вы используете миграцию на основе кода, и вы переименовываете свойство объекта, и у вас есть уникальный индекс для свойства, инфраструктура сущности создаст новый столбец и попытается добавить уникальный индекс для нового столбца но новый столбец имеет все нулевые значения, поэтому он потерпит неудачу. Вам необходимо вручную изменить код перехода, чтобы скопировать данные из старого столбца перед строкой для создания индекса.

 Смежные вопросы

  • Нет связанных вопросов^_^