Создание уникальных индексов
Создание уникального индекса гарантирует, что любая попытка дублирования ключевых значений потерпит неудачу. Нет существенных различий между созданием ограничения 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.
Примечание. |
---|
IGNORE_DUP_KEY не может быть определен для индекса, созданного по представлению, или для XML-индекса. |
Обработка значений NULL
В целях индексирования значения NULL рассматриваются как равные. Следовательно, нельзя создать уникальный индекс или ограничение UNIQUE, если ключевые значения NULL присутствуют в более чем одной строке. Выбирайте столбцы, определенные как NOT NULL, при выборе столбцов для уникального индекса или ограничения уникальности.
Требования к свободному месту на диске
Процесс определения требований к свободному месту на диске для уникальных индексов аналогичен тому же процессу для кластеризованных и некластеризованных индексов. Сведения о требованиях к свободному месту на диске для индексов см. в разделе Определение требований к месту на диске для индексов.
Создание индекса при создании таблицы
Создание индекса по существующей таблице
См. также
Основные понятия
Коэффициент заполнения
Параметр index create memory
Изменение индексов
Помещение индексов в файловые группы
Ограничения PRIMARY KEY
Ограничения UNIQUE
Другие ресурсы
ALTER INDEX (Transact-SQL)
sys.indexes (Transact-SQL)