Что такое ограничение UNIQUE в SQL?

Ответ

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

Ключевые особенности:

  • Отличие от PRIMARY KEY: UNIQUE допускает наличие значений NULL. Однако в большинстве СУБД в столбце с UNIQUE может быть только одна строка со значением NULL.
  • На уровне столбца или таблицы: Можно определить для одного или нескольких столбцов.

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

  1. При создании таблицы (на уровне столбца):

    CREATE TABLE users (
        id INT PRIMARY KEY,
        email VARCHAR(255) UNIQUE, -- Каждый email должен быть уникальным
        username VARCHAR(50) UNIQUE NOT NULL -- username уникален и не может быть NULL
    );
  2. При создании таблицы (составной UNIQUE):

    CREATE TABLE class_registry (
        student_id INT,
        class_id INT,
        semester VARCHAR(10),
        UNIQUE (student_id, class_id, semester) -- Один студент не может записаться на один класс в один семестр дважды
    );
  3. Добавление ограничения к существующей таблице:

    ALTER TABLE users ADD CONSTRAINT uk_user_email UNIQUE (email);
  4. Удаление ограничения:

    ALTER TABLE users DROP CONSTRAINT uk_user_email;
    -- Или, если ограничение не было названо, СУБД сама сгенерировала имя:
    ALTER TABLE users DROP CONSTRAINT users_email_key; -- Пример для PostgreSQL

Что происходит при нарушении? При попытке вставить или обновить строку, приводящую к дублированию значений в столбцах с UNIQUE, СУБД вызовет ошибку нарушения ограничения уникальности.

Ответ 18+ 🔞

Смотри, вот тебе про эту самую UNIQUE хитрость в SQL, чтоб ты понимал, как она работает, а не просто тупо зубрил.

Представь себе, блядь, столбец в таблице — это как очередь в столовую. UNIQUE — это такой злой батя-админ, который стоит и смотрит: «Чтоб никто не повторялся, сука!». Два Васи Пупкина в одной строчке? Не, хуй там, ошибку тебе в ебало и всё, иди нахуй, исправляй.

Важные нюансы, чтоб не облажаться:

  • Чем не PRIMARY KEY: PRIMARY KEY — это прям царь и бог, он и уникальный, и NULL ему нельзя. А UNIQUE — это как его заместитель, попроще. NULL он в принципе разрешает, но, внимание, ёпта! Обычно только ОДИН раз. То есть две строчки с NULL в уникальном столбце — это уже пиздец, нарушение. Хотя зависит от СУБД, но так, в среднем по больнице.
  • Можно на один столбец, а можно и на компанию: Можно сказать «этот email чтоб один был», а можно сказать «а вот комбинация студент-предмет-семестр — чтоб неповторимая была, блядь!». Умно.

Как это выглядит в коде, на примерах:

  1. Создаём таблицу, сразу пришпиливаем уникальность к столбцу:

    CREATE TABLE users (
        id INT PRIMARY KEY,
        email VARCHAR(255) UNIQUE, -- Email — уникальный, но может быть и NULL (один раз!)
        username VARCHAR(50) UNIQUE NOT NULL -- Юзернейм — уникальный и пустым быть не может, совсем
    );
  2. Составная уникальность, когда важен набор:
    Вот тут, представляешь, студент может записаться на много предметов, предметов много, но чтоб он на один и тот же предмет в один и тот же семестр дважды не вписался — вот это и есть UNIQUE на несколько столбцов.

    CREATE TABLE class_registry (
        student_id INT,
        class_id INT,
        semester VARCHAR(10),
        UNIQUE (student_id, class_id, semester) -- Вот эта тройка — как отпечаток пальца, один хуй на всех
    );
  3. Опа, таблица уже есть, а уникальности нет? Добавляем:
    Живём, живём, а потом — бац! — и поняли, что email-то повторяются, пиздец. Ладно, чиним:

    ALTER TABLE users ADD CONSTRAINT uk_user_email UNIQUE (email);

    CONSTRAINT uk_user_email — это мы даём имя нашей фишке, чтоб потом, если что, не искать как собака.

  4. Надоело ограничение? Сносим нахуй:
    Решили, что email пусть повторяются? Ну, бывает, ебать... Удаляем:

    ALTER TABLE users DROP CONSTRAINT uk_user_email;

    А если имя забыли, когда создавали, то СУБД сама какое-нибудь левое придумала, типа users_email_key. Придётся его искать и подставлять.

Что будет, если наебать систему?
Попробуй вставить дубликат в уникальный столбец — получишь ошибку, прям в лоб. Типа «Нарушение ограничения уникальности, идиот». И транзакция, скорее всего, откатится. Так что лучше проверяй данные, прежде чем пихать, а то будет тебе волнение, ебать, на ровном месте.