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

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

CREATE UNIQUE NONCLUSTERED INDEX IX_TopicShortName
ON DimMeasureTopic(TopicShortName)

Ошибка:

Сообщение 1505, Уровень 16, состояние 1, оператор Line 1 The 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 не отображается. Таким образом, кажется, нет дубликата.

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

47
задан Jon Seigel 2 May 2010 в 15:42
поделиться

3 ответа

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

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

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

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

89
ответ дан 26 November 2019 в 19:28
поделиться

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

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

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

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

-121--1112758-

В SQL Server ограничение уникальности действительно реализовано как уникальный индекс. Используйте

CREATE UNIQUE INDEX <uix_name> ON <table_name>(<col_A>, <col_B>)

Для получения дополнительной информации см. на этой странице MSDN .

-121--2070716-

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

SELECT TopicShortName, COUNT(*)
FROM DimMeasureTopic
GROUP BY TopicShortName
HAVING COUNT(*) > 1
12
ответ дан 26 November 2019 в 19:28
поделиться

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

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

5
ответ дан 26 November 2019 в 19:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: