Уникальный индекс SQL Server

В этом руководстве вы узнаете об уникальных индексах 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] ';

Индекс SQL Server UNIQUE — сканирование кластеризованного индекса

Оптимизатор запросов должен просканировать весь кластеризованный индекс, чтобы найти строку.

Чтобы ускорить получение запроса, вы можете добавить некластеризованный индекс к столбцу электронной почты.

Однако, предполагая, что у каждого клиента будет уникальный адрес электронной почты, вы можете создать уникальный индекс для столбца «Электронная почта».

Поскольку в таблице 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 и применять метод поиска по индексу для поиска строк по адресу электронной почты.

УНИКАЛЬНЫЙ индекс SQL Server - Поиск индекса

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

Мирослав С.

Автор статей, ИБ-специалист