Ответ
Ограничение UNIQUE в SQL гарантирует, что все значения в указанном столбце (или комбинации столбцов) таблицы будут различаться.
Ключевые особенности:
- Отличие от PRIMARY KEY:
UNIQUEдопускает наличие значенийNULL. Однако в большинстве СУБД в столбце сUNIQUEможет быть только одна строка со значениемNULL. - На уровне столбца или таблицы: Можно определить для одного или нескольких столбцов.
Синтаксис и примеры:
-
При создании таблицы (на уровне столбца):
CREATE TABLE users ( id INT PRIMARY KEY, email VARCHAR(255) UNIQUE, -- Каждый email должен быть уникальным username VARCHAR(50) UNIQUE NOT NULL -- username уникален и не может быть NULL ); -
При создании таблицы (составной UNIQUE):
CREATE TABLE class_registry ( student_id INT, class_id INT, semester VARCHAR(10), UNIQUE (student_id, class_id, semester) -- Один студент не может записаться на один класс в один семестр дважды ); -
Добавление ограничения к существующей таблице:
ALTER TABLE users ADD CONSTRAINT uk_user_email UNIQUE (email); -
Удаление ограничения:
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 чтоб один был», а можно сказать «а вот комбинация студент-предмет-семестр — чтоб неповторимая была, блядь!». Умно.
Как это выглядит в коде, на примерах:
-
Создаём таблицу, сразу пришпиливаем уникальность к столбцу:
CREATE TABLE users ( id INT PRIMARY KEY, email VARCHAR(255) UNIQUE, -- Email — уникальный, но может быть и NULL (один раз!) username VARCHAR(50) UNIQUE NOT NULL -- Юзернейм — уникальный и пустым быть не может, совсем ); -
Составная уникальность, когда важен набор:
Вот тут, представляешь, студент может записаться на много предметов, предметов много, но чтоб он на один и тот же предмет в один и тот же семестр дважды не вписался — вот это и естьUNIQUEна несколько столбцов.CREATE TABLE class_registry ( student_id INT, class_id INT, semester VARCHAR(10), UNIQUE (student_id, class_id, semester) -- Вот эта тройка — как отпечаток пальца, один хуй на всех ); -
Опа, таблица уже есть, а уникальности нет? Добавляем:
Живём, живём, а потом — бац! — и поняли, что email-то повторяются, пиздец. Ладно, чиним:ALTER TABLE users ADD CONSTRAINT uk_user_email UNIQUE (email);CONSTRAINT uk_user_email— это мы даём имя нашей фишке, чтоб потом, если что, не искать как собака. -
Надоело ограничение? Сносим нахуй:
Решили, что email пусть повторяются? Ну, бывает, ебать... Удаляем:ALTER TABLE users DROP CONSTRAINT uk_user_email;А если имя забыли, когда создавали, то СУБД сама какое-нибудь левое придумала, типа
users_email_key. Придётся его искать и подставлять.
Что будет, если наебать систему?
Попробуй вставить дубликат в уникальный столбец — получишь ошибку, прям в лоб. Типа «Нарушение ограничения уникальности, идиот». И транзакция, скорее всего, откатится. Так что лучше проверяй данные, прежде чем пихать, а то будет тебе волнение, ебать, на ровном месте.