В этом руководстве вы узнаете об уникальных индексах SQL Server и о том, как их использовать для обеспечения уникальности значений в одном или нескольких столбцах таблицы.
Обзор уникального индекса SQL Server
Уникальный индекс гарантирует, что ключевые столбцы индекса не содержат повторяющихся значений.
Уникальный индекс может состоять из одного или нескольких столбцов. Если уникальный индекс имеет один столбец, значения в этом столбце будут уникальными. Если уникальный индекс имеет несколько столбцов, комбинация значений в этих столбцах будет уникальной.
Любая попытка вставить или обновить данные в столбцы уникального ключа индекса, вызывающие дублирование, приведет к ошибке.
Уникальный индекс может быть кластеризованным или некластеризованным.
Чтобы создать уникальный индекс, используйте оператор CREATE UNIQUE INDEX следующим образом:
CREATE UNIQUE INDEX index_name ON table_name(column_list);
В этом синтаксисе:
- Сначала укажите имя уникального индекса после ключевых слов CREATE UNIQUE INDEX.
- Во-вторых, укажите имя таблицы, с которой связан индекс, и список столбцов, которые будут включены в индекс.
Примеры уникальных индексов SQL Server
Давайте рассмотрим несколько примеров использования уникальных индексов.
1) Создание уникального индекса SQL Server для примера одного столбца
Этот запрос находит клиента с адресом электронной почты « [email protected] »:
SELECT customer_id, email FROM sales.customers WHERE email = ' [email protected] ';
Оптимизатор запросов должен просканировать весь кластеризованный индекс, чтобы найти строку.
Чтобы ускорить получение запроса, вы можете добавить некластеризованный индекс к столбцу электронной почты.
Однако, предполагая, что у каждого клиента будет уникальный адрес электронной почты, вы можете создать уникальный индекс для столбца «Электронная почта».
Поскольку в таблице sales.customers уже есть данные, сначала необходимо проверить повторяющиеся значения в столбце email:
SELECT email, COUNT(email) FROM sales.customers GROUP BY email HAVING COUNT(email) > 1;
Запрос возвращает пустой набор результатов. Это означает, что в столбце email нет повторяющихся значений.
Таким образом, вы можете приступить к созданию уникального индекса для столбца электронной почты таблицы sales.customers:
CREATE UNIQUE INDEX ix_cust_email ON sales.customers(email);
С этого момента оптимизатор запросов будет использовать индекс ix_cust_email и применять метод поиска по индексу для поиска строк по адресу электронной почты.
2) Создание уникального индекса SQL Server для нескольких столбцов
Сначала создайте таблицу с именем t1, содержащую два столбца для демонстрации:
CREATE TABLE t1( a INT, b INT );
Далее создайте уникальный индекс, включающий столбцы a и b:
CREATE UNIQUE INDEX ix_uniq_ab ON t1(a, b);
Затем вставьте новую строку в таблицу t1:
INSERT INTO t1(a,b) VALUES(1,1);
После этого вставьте еще одну строку в таблицу t1. Обратите внимание, что значение 1 повторяется в столбце a, но комбинация значений в столбцах a и b не дублируется:
INSERT INTO t1(a,b) VALUES(1,2);
Наконец, вставьте строку, которая уже существует, в таблицу t1:
INSERT INTO t1(a,b) VALUES(1,2);
SQL Server выдает ошибку::
Cannot insert duplicate key row in object 'dbo.t1' with unique index 'ix_ab'. The duplicate key value is(1, 2).
Уникальный индекс SQL Server и NULL
NULL — это нечто особенное. Это маркер, который указывает на отсутствие информации или ее неприменимость.
NULL даже не равен самому себе. Однако, когда дело доходит до уникального индекса, SQL Server обрабатывает значения NULL одинаково. Это означает, что если вы создаете уникальный индекс для столбца, допускающего значение NULL, в этом столбце может быть только одно значение NULL
Следующие операторы создают новую таблицу с именем t2 и определяют уникальный индекс для столбца a:
CREATE TABLE t2( a INT ); CREATE UNIQUE INDEX a_uniq_t2 ON t2(a);
Этот запрос вставляет NULL в столбец a таблицы t2:
INSERT INTO t2(a) VALUES(NULL);
Однако при повторном выполнении вышеуказанного запроса SQL Server выдает ошибку из-за дублирующихся значений NULL:
]Cannot insert duplicate key row in object 'dbo.t2' with unique index 'a_uniq_t2'. The duplicate key value is().(2601)
Уникальный индекс против ограничения UNIQUE
Как уникальный индекс, так и ограничение UNIQUE обеспечивают уникальность значений в одном или нескольких столбцах. SQL Server проверяет дубликаты одинаково как для уникального индекса, так и для уникального ограничения.
При создании уникального ограничения SQL Server автоматически создает уникальный индекс, связанный с этим ограничением.
Однако создание уникального ограничения для столбцов делает цель уникального индекса ясной.
В этом руководстве вы узнали об уникальном индексе SQL Server и о том, как создать уникальный индекс для одного или нескольких столбцов таблицы.