Что делает ограничение `UNIQUE` в SQL и чем оно отличается от `PRIMARY KEY`?

«Что делает ограничение `UNIQUE` в SQL и чем оно отличается от `PRIMARY KEY`?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ограничение UNIQUE в SQL гарантирует, что все значения в указанном столбце (или комбинации столбцов) таблицы будут различными. Его основная задача — обеспечить целостность данных, предотвращая дублирование.

Синтаксис и пример:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email VARCHAR(255) UNIQUE, -- Не может быть двух одинаковых email
    username VARCHAR(50) UNIQUE NOT NULL
);
-- Или для составного уникального ключа:
CREATE TABLE subscriptions (
    user_id INT,
    course_id INT,
    UNIQUE(user_id, course_id) -- Пользователь не может быть подписан на курс дважды
);

При попытке вставить или обновить строку, нарушающую ограничение, СУБД выбросит ошибку.

Сравнение UNIQUE и PRIMARY KEY:

Критерий PRIMARY KEY UNIQUE
Количество в таблице Только один. Много.
Значения NULL Запрещены. Столбец NOT NULL. Разрешены (в большинстве СУБД, например, PostgreSQL, MySQL). Но NULL считается уникальным, поэтому может быть много строк с NULL.
Индексы Создает кластеризованный (часто) или некластеризованный индекс. Создает некластеризованный индекс для быстрой проверки уникальности.
Семантика Главный идентификатор строки. Обеспечение уникальности бизнес-данных.

Практическое применение:

  • Электронная почта, логин, номер паспорта в таблице пользователей.
  • Артикул товара в каталоге.
  • Предотвращение дублей в связующих таблицах (как в примере с подписками).