0Pricing
SQL Academy · Урок

Ограничения UNIQUE и составные ключи

Обеспечивайте уникальность одного или нескольких столбцов, разберитесь с NULL в уникальных индексах и используйте составную уникальность для естественных ключей

«Ограничения UNIQUE и составные ключи» — бесплатный урок SQL Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.

UNIQUE: дубликаты запрещены

Ограничение UNIQUE запрещает двум строкам иметь одинаковое значение в ограниченных столбцах:

CREATE TABLE users (
  id BIGSERIAL PRIMARY KEY,
  email VARCHAR(255) NOT NULL UNIQUE,
  username VARCHAR(50) UNIQUE
);

UNIQUE создаёт индекс

Ограничение UNIQUE реализуется с помощью уникального индекса B-дерева, поэтому поиск по этому столбцу выполняется быстро.

-- This shows the implicit index:
SELECT indexname FROM pg_indexes WHERE tablename = 'users';

Составной UNIQUE

Уникальность сочетания столбцов:

CREATE TABLE memberships (
  user_id BIGINT NOT NULL,
  group_id BIGINT NOT NULL,
  role TEXT NOT NULL,
  UNIQUE (user_id, group_id)        -- a user can be in a group at most once
);

UNIQUE и PRIMARY KEY

Первичный ключ по сути объединяет UNIQUE + NOT NULL и задаёт идентификатор. В таблице может быть ОДИН первичный ключ, но много ограничений UNIQUE.

NULL в UNIQUE

Стандартный SQL считает NULL отличным от любого другого значения, включая другие NULL. В столбце UNIQUE может быть несколько строк со значением NULL:

CREATE TABLE invites (email VARCHAR(255) UNIQUE);
INSERT INTO invites VALUES (NULL), (NULL);   -- both succeed

-- PostgreSQL 15+ offers UNIQUE NULLS NOT DISTINCT to treat NULL as equal:
CREATE TABLE invites2 (email VARCHAR(255) UNIQUE NULLS NOT DISTINCT);

Составной первичный ключ

Если естественный составной ключ подходит, используйте его как PRIMARY KEY:

CREATE TABLE order_items (
  order_id   BIGINT NOT NULL REFERENCES orders(id) ON DELETE CASCADE,
  product_id BIGINT NOT NULL REFERENCES products(id),
  quantity   INT NOT NULL CHECK (quantity > 0),
  PRIMARY KEY (order_id, product_id)
);

Суррогатный ключ + естественный ключ UNIQUE

Распространённый шаблон: искусственный идентификатор как первичный ключ, а уникальность в предметной области обеспечивается через UNIQUE:

CREATE TABLE products (
  id BIGSERIAL PRIMARY KEY,
  sku VARCHAR(50) NOT NULL UNIQUE,
  name TEXT NOT NULL
);

Частичные уникальные индексы

Уникальность только среди некоторых строк:

-- One active email per user (deleted users can re-register):
CREATE UNIQUE INDEX users_active_email_idx
  ON users (email)
  WHERE deleted_at IS NULL;

Уникальные индексы по выражению

Уникальность вычисляемого выражения — полезно для адресов электронной почты без учёта регистра:

CREATE UNIQUE INDEX users_email_ci_idx ON users (LOWER(email));

Ошибки нарушения UNIQUE

Вставка дубликата возвращает:

ERROR:  duplicate key value violates unique constraint "users_email_key"
DETAIL:  Key (email)=(alice@example.com) already exists.

UPSERT строится на UNIQUE

ON CONFLICT требует UNIQUE или PRIMARY KEY в качестве цели — так PostgreSQL понимает, что считать дубликатом.

Итоги

UNIQUE — второе по важности ограничение после NOT NULL.

  • Одиночное или составное
  • Частичное UNIQUE — «только среди активных строк»
  • UNIQUE по выражению — для ключей без учёта регистра
  • Помните о правиле «NULL считается отличным»

Быстрая проверка

Может ли столбец UNIQUE содержать несколько значений NULL в стандартном SQL?

Часто задаваемые вопросы

Урок «Ограничения UNIQUE и составные ключи» бесплатный?

Да — полный текст урока «Ограничения UNIQUE и составные ключи» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.

Чему я научусь в уроке «Ограничения UNIQUE и составные ключи»?

Обеспечивайте уникальность одного или нескольких столбцов, разберитесь с NULL в уникальных индексах и используйте составную уникальность для естественных ключей Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Academy?

Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Ограничения UNIQUE и составные ключи»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Academy?

Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Ограничения NOT NULL и CHECK
  2. Ограничения UNIQUE и составные ключи
  3. FOREIGN KEY и ссылочные действия
  4. Значения DEFAULT и генерируемые столбцы
← Назад к SQL Academy