Создание уникальных индексов
Создание уникального индекса гарантирует, что любая попытка дублирования ключевых значений потерпит неудачу. Нет существенных различий между созданием ограничения UNIQUE и созданием уникального индекса, не зависящего от ограничения. Проверка данных происходит подобным же образом, и оптимизатор запросов не делает различия между уникальным индексом, который создан ограничением, и индексом, созданным вручную. Однако следует создать ограничение UNIQUE по столбцу в случае, если предназначением индекса является целостность данных. Это делает предназначение индекса очевидным.
Типичная реализация
Уникальные индексы реализуются следующими способами:
Ограничение PRIMARY KEY или UNIQUE
Если кластеризованный индекс в таблице еще не создан, а уникальный некластеризованный индекс еще не указан, то при создании ограничения PRIMARY KEY в одном или нескольких столбцах автоматически создается уникальный кластеризованный индекс. В столбце первичного ключа недопустимы значения NULL.
При создании ограничения UNIQUE создается уникальный некластеризованный индекс. Он нужен, чтобы принудительно применять ограничение UNIQUE по умолчанию. Если кластеризованный индекс в таблице еще не создан, то можно указать уникальный кластеризованный индекс.
Дополнительные сведения см. в разделах Ограничения PRIMARY KEY и Ограничения UNIQUE.
Индекс, не зависящий от ограничения
По таблице может быть определено несколько уникальных некластеризованных индексов.
Дополнительные сведения см. в разделе CREATE INDEX (Transact-SQL).
Индексированное представление
Чтобы создать индексированное представление, по одному или нескольким столбцам представления определяется уникальный кластеризованный индекс. Представление выполняется (материализуется), и результирующий набор сохраняется на конечном уровне индекса тем же способом, как сохраняются в кластеризованном индексе табличные данные. Дополнительные сведения см. в разделе Создание индексированных представлений.
Разрешение проблем с дублированием значений
Уникальный индекс или ограничение не могут быть созданы, если существуют дублирующиеся значения в ключевых столбцах. Например, если необходимо создать уникальный составной индекс по столбцам FirstName и LastName, и при этом существуют две строки в таблице, содержащие значения 'Jane' и 'Smith' в столбцах FirstName и LastName, создание уникального индекса невозможно. Эту проблему можно решить одним из следующих способов:
Добавить или удалить столбцы в определении индекса, чтобы создать уникальную комбинацию. В предыдущем примере добавление столбца MiddleName в определение индекса может решить проблему дублирования значений.
Если дублирование значений является результатом ошибок ввода данных, исправьте данные вручную и затем создайте индекс или ограничение.
Использование параметра IGNORE_DUP_KEY для обработки дублирующихся значений
При создании или изменении уникального индекса или ограничения можно присваивать параметру IGNORE_DUP_KEY значения ON или OFF. Этот параметр определяет реакцию на ошибку, возникающую при попытке вставки повторяющихся ключевых значений в уникальный индекс. Параметр IGNORE_DUP_KEY применяется только к операциям вставки, производимым после создания или перестроения индекса. Этот параметр не действует при выполнении инструкций CREATE INDEX, ALTER INDEX или UPDATE. Значение по умолчанию — OFF.
ON
Если в уникальный индекс вставляются повторяющиеся значения ключа, выводится предупреждающее сообщение. С ошибкой завершаются только строки, нарушающие ограничение уникальности.OFF
Если в уникальный индекс вставляются повторяющиеся значения ключа, выводится сообщение об ошибке. Будет выполнен откат всей операции INSERT.
Например, если отдельная инструкция вставляет 20 строк в таблицу с уникальным индексом, и 10 из этих строк содержат дублирующиеся ключевые значения, по умолчанию все 20 строк отклоняются. Однако если параметр индекса IGNORE_DUP_KEY имеет значение ON, только 10 повторяющихся ключевых значений будут отклонены; остальные 10 неповторяющихся ключевых значений будут вставлены в таблицу.
Параметр IGNORE_DUP_KEY не может иметь значение ON для индексов, созданных на представлении, неуникальных индексов, XML-индексов, пространственных индексов и отфильтрованных индексов.
Для просмотра значения IGNORE_DUP_KEY используйте sys.indexes.
Для обратной совместимости синтаксиса аргумент WITH IGNORE_DUP_KEY эквивалентен аргументу WITH IGNORE_DUP_KEY = ON.
Обработка значений NULL
В целях индексирования значения NULL рассматриваются как равные. Следовательно, нельзя создать уникальный индекс или ограничение UNIQUE, если ключевые значения NULL присутствуют в более чем одной строке. Выбирайте столбцы, определенные как NOT NULL, при выборе столбцов для уникального индекса или ограничения уникальности.
Требования к свободному месту на диске
Процесс определения требований к свободному месту на диске для уникальных индексов аналогичен тому же процессу для кластеризованных и некластеризованных индексов. Сведения о требованиях к свободному месту на диске для индексов см. в разделе Определение требований к месту на диске для индексов.