Невозможно создать индекс из-за дубликата, который не существует? - PullRequest
45 голосов
/ 02 февраля 2010

Я получаю сообщение об ошибке при выполнении следующей команды 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 не отображается. Так что, похоже, нет дубликата.

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

Ответы [ 5 ]

86 голосов
/ 02 февраля 2010

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

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

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

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

12 голосов
/ 02 февраля 2010

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

SELECT TopicShortName, COUNT(*)
FROM DimMeasureTopic
GROUP BY TopicShortName
HAVING COUNT(*) > 1
5 голосов
/ 02 февраля 2010

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

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

3 голосов
/ 30 октября 2015

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

0 голосов
/ 19 июня 2019

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

...