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)
Создание уникальных индексов
Создание ограничений уникальности