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

Создание уникального индекса гарантирует, что любая попытка дублирования ключевых значений потерпит неудачу. Нет существенных различий между созданием ограничения 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. Этот параметр определяет ответ на ошибку дублирования ключевых значений в многострочной инструкции INSERT после создания индекса. Когда IGNORE_DUP_KEY установлен на OFF (по умолчанию), SQL Server 2005 Database Engine отклоняет все строки в инструкции, если одна или более строк содержит дублирующиеся ключевые значения. Когда параметру присвоено значение ON, отклоняются только те строки, которые содержат дублирующиеся ключевые значения; недублирующиеся ключевые значения добавляются.

Например, если отдельная инструкция вставляет 20 строк в таблицу с уникальным индексом, и 10 из этих строк содержат дублирующиеся ключевые значения, по умолчанию все 20 строк отклоняются. Однако если параметр индекса IGNORE_DUP_KEY установлен на ON, только 10 дублирующихся ключевых значений будут отклонены; остальные 10 недублирующихся ключевых значений будут вставлены в таблицу.

Значение параметра хранится в метаданных индекса. Чтобы отобразить текущее значение, используйте представление каталога sys.indexes.

ms175132.note(ru-ru,SQL.90).gifПримечание.
IGNORE_DUP_KEY не может быть определен для индекса, созданного по представлению, или для XML-индекса.

Обработка значений NULL

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

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

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

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

CREATE TABLE (Transact-SQL)

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

CREATE INDEX (Transact-SQL)

См. также

Основные понятия

Коэффициент заполнения
Параметр index create memory
Изменение индексов
Помещение индексов в файловые группы
Ограничения PRIMARY KEY
Ограничения UNIQUE

Другие ресурсы

ALTER INDEX (Transact-SQL)
sys.indexes (Transact-SQL)

Справка и поддержка

Получение помощи по SQL Server 2005