Создание уникальных индексов

Создание уникального индекса гарантирует, что любая попытка дублирования ключевых значений потерпит неудачу. Нет существенных различий между созданием ограничения 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, при выборе столбцов для уникального индекса или ограничения уникальности.

Требования к свободному месту на диске

Процесс определения требований к свободному месту на диске для уникальных индексов аналогичен тому же процессу для кластеризованных и некластеризованных индексов. Сведения о требованиях к свободному месту на диске для индексов см. в разделе Определение требований к месту на диске для индексов.

Создание индекса при создании таблицы

Создание индекса по существующей таблице