Подтвердить что ты не робот

Не удалось создать индекс из-за дублирования, которого не существует?

У меня возникла ошибка при выполнении следующей команды Transact-SQL:

CREATE UNIQUE NONCLUSTERED INDEX IX_TopicShortName
ON DimMeasureTopic(TopicShortName)

Ошибка:

Msg 1505, уровень 16, состояние 1, строка 1 Оператор CREATE UNIQUE INDEX поскольку дублирующий ключ был найдено для имени объекта 'dbo.DimMeasureTopic' и индекс name 'IX_TopicShortName'. Значение дублирующегося ключа равно().

Когда я запускаю SELECT * FROM sys.indexes WHERE name = 'IX_TopicShortName' или SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[DimMeasureTopic]'), индекс IX_TopicShortName не отображается. Таким образом, похоже, что это не дубликат.

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

Он должен был указать значение дублированного ключа в сообщении об ошибке. "Дубликат ключевого значения ((',' ',' '). Оператор завершен. У вас есть дубликаты значений, которые необходимо устранить."