Что такое уникальный ключ?sql-17

Уникальный ключ (Unique Key) — это ограничение в реляционных базах данных, которое гарантирует, что все значения в указанном столбце (или комбинации столбцов) будут отличаться друг от друга. В отличие от первичного ключа, уникальный ключ позволяет иметь NULL-значения (но обычно только одно NULL-значение на столбец, в зависимости от СУБД).

Основные характеристики уникального ключа

  1. Уникальность значений
    Не допускает дублирования данных в указанных столбцах.

  2. Допустимость NULL
    Может содержать NULL-значения (в большинстве СУБД только один NULL разрешён).

  3. Множественность
    В таблице может быть несколько уникальных ключей.

  4. Не кластеризуется
    В отличие от первичного ключа, не создаёт кластеризованный индекс по умолчанию.

Примеры создания уникального ключа

Вариант 1: При создании таблицы

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    email VARCHAR(100) UNIQUE,  -- Уникальный ключ на один столбец
    passport_number VARCHAR(20),
    CONSTRAINT uk_passport UNIQUE (passport_number)  -- Именованный уникальный ключ
);

Вариант 2: Добавление к существующей таблице

ALTER TABLE products
ADD CONSTRAINT uk_product_code UNIQUE (product_code);

Составной уникальный ключ

CREATE TABLE classroom_bookings (
    room_id INT,
    booking_date DATE,
    timeslot INT,
    PRIMARY KEY (room_id, booking_date),
    CONSTRAINT uk_booking UNIQUE (booking_date, timeslot)  -- Нельзя забронировать один слот дважды
);

Практическое применение уникальных ключей

  1. Защита от дублирования
    Например, для email-адресов пользователей, номеров паспортов, артикулов товаров.

  2. Альтернативные идентификаторы
    Когда поле может быть PK, но уже есть другой первичный ключ.

  3. Обеспечение бизнес-правил
    Например, "один пользователь - один промокод".

Разница между уникальным и первичным ключом

КритерийУникальный ключПервичный ключ
NULL-значенияРазрешены (обычно один)Запрещены
Количество в таблицеМожет быть несколькоТолько один
ИндексированиеНе кластеризованныйКластеризованный (обычно)
Использование в FKВозможно, но не принятоОсновное назначение

Особенности работы с NULL в уникальных ключах

В разных СУБД поведение с NULL различается:

  • MySQL/PostgreSQL: Множественные NULL разрешены
  • SQL Server: Только один NULL допускается
  • Oracle: NULL значения не считаются равными (можно много NULL)
-- Пример для SQL Server (только один NULL)
CREATE TABLE test (
    id INT IDENTITY,
    code VARCHAR(10) UNIQUE  -- Только одна строка может иметь NULL в этом поле
);

Резюмируем: уникальный ключ — это мощный инструмент обеспечения целостности данных, который предотвращает дублирование значений в столбцах, но при этом сохраняет гибкость за счёт допустимости NULL-значений. Он особенно полезен для реализации бизнес-правил и альтернативных идентификаторов помимо первичного ключа.