Поделиться через


MSSQLSERVER_1505

Область применения: SQL Server

Сведения

Атрибут Значение
Название продукта SQL Server
ИД события 1505
Источник событий MSSQLSERVER
Компонент SQLEngine
Символическое имя DUP_KEY
Текст сообщения CREATE UNIQUE INDEX завершен, так как для имени объекта "%.*ls" и имени индекса "%.*ls" найден дубликат ключа. Повторяющимся значением ключа является %ls.

Описание

Эта ошибка происходит при попытке создать уникальный индекс, а указанное повторяющееся значение содержится больше чем в одной строке в таблице. Уникальный индекс создается при создании индекса и указании ключевого слова UNIQUE либо при создании ограничения UNIQUE. Таблица не может содержать какие-либо строки, которые имеют повторяющиеся значения в столбцах, определенных в индексе или ограничении.

Давайте рассмотрим данные в таблице Employee:

LastName FirstName JobTitle HireDate
Уолтерс Роб Старший конструктор 2004-11-19
Коричневый Кевин Ассистент по маркетингу NULL
Коричневый Анна Инженер-проектировщик NULL
Уолтерс Роб Разработчик 2001-08-09

Из-за того, что в строках есть повторяющиеся значения, мы не можем создать уникальный индекс по столбцу LastName или сочетанию столбцов LastName, FirstName.

Менее очевидно, что в столбце HireDate также может нарушаться уникальность. В целях индексирования значения NULL рассматриваются как равные. Следовательно, нельзя создать уникальный индекс или ограничение, если значения ключа NULL присутствуют больше чем в одной строке. С учетом вышесказанного мы не можем создать уникальный индекс по столбцу HireDate или сочетанию столбцов LastName, HireDate.

В сообщении об ошибке 1505 возвращается первая строка, нарушающая ограничение уникальности. В таблице могут быть другие повторяющиеся строки. Чтобы найти все повторяющиеся строки, выполните запрос к указанной таблице и используйте предложения GROUP BY и HAVING, чтобы получить информацию о повторяющихся строках. Например, следующий запрос возвращает строки таблицы Employee, в которых есть повторяющиеся значения имени и фамилии:

SELECT LastName, FirstName, count(*) FROM dbo. Имя последнего имени сотрудника GROUP BY, firstName HAVING count(*) > 1;

Действие пользователя

Рассмотрим следующие решения.

  • Добавить или удалить столбцы в определении индекса или ограничения, чтобы создать уникальное сочетание. В предыдущем примере мы можем решить проблему повторения значений, добавив в определение индекса или ограничения столбец MiddleName.

  • Выбирайте столбцы, определенные как NOT NULL, при определении столбцов для уникального индекса или ограничения уникальности. При этом исключается возможность возникновения нарушения уникальности, когда больше чем в одной строке содержится значение NULL в значениях ключа.

  • Если дублирование значений является результатом ошибок ввода данных, исправьте данные вручную и затем создайте индекс или ограничение. Дополнительные сведения об удалении повторяющихся строк в таблице см. в статье "Удаление повторяющихся строк из таблицы SQL Server".

См. также

Инструкция CREATE INDEX (Transact-SQL)
Создание уникальных индексов
Создание ограничений уникальности