MSSQLSERVER_1505

Данные

Название продукта

SQL Server

Версия продукта

10.0

Номер сборки продукта

10.0

Идентификатор события

1505

Источник события

MSSQLSERVER

Компонент

SQLEngine

Символическое имя

DUP_KEY

Текст сообщения

Операция CREATE UNIQUE INDEX прервана, поскольку обнаружен повторяющийся ключ, относящийся к имени объекта «%.*ls» и имени индекса «%.*ls». Повторяющимся значением ключа является %ls.

Пояснение

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

Рассмотрим данные в следующей таблице Employee:

Фамилия

Имя

Название должности

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.Employee GROUP BY LastName, FirstName HAVING count(*) > 1;

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

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

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

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

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