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.
См. также