Получить доступ

Чем primary key отличается от unique-ограничения?

JuniorJOIN, ключи и ограниченияSQL
Ещё спрашивают так:
  • Сколько первичных ключей может быть у таблицы?
  • Может ли UNIQUE-колонка содержать NULL?
Коротко

Первичный ключ — главный идентификатор строки: уникален, NOT NULL, один на таблицу, на него ссылаются внешние ключи. UNIQUE — дополнительная гарантия уникальности, таких может быть много.

  • Оба создают уникальный индекс
  • UNIQUE допускает NULL — и несколько NULL (NULL не равен NULL), кроме NULLS NOT DISTINCT в PostgreSQL 15+
  • Первичный ключ — обычно суррогатный (id), UNIQUE — бизнес-уникальность (email, ИНН)

А ещё В InnoDB первичный ключ определяет физический порядок строк

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

PRIMARY KEY:

  • уникален и не может быть NULL;
  • один на таблицу (может быть составным);
  • на него обычно ссылаются внешние ключи;
  • в MySQL InnoDB таблица физически хранится как B-дерево по первичному ключу (кластерный индекс), и вторичные индексы хранят первичный ключ.

UNIQUE:

  • уникальность значений, ограничений может быть несколько;
  • NULL разрешён, и по стандарту несколько NULL не нарушают уникальность — NULL не равен NULL. В PostgreSQL 15 появилось UNIQUE NULLS NOT DISTINCT;
  • на UNIQUE тоже можно ссылаться внешним ключом.

Как использовать: первичный ключ — стабильный суррогатный идентификатор (bigint identity или UUIDv7), а бизнес-правила уникальности (email, номер договора) — отдельными UNIQUE. Так смена email не затронет все ссылки.

Уникальность только в коде («проверить, что email свободен, потом вставить») — гонка: два параллельных запроса пройдут проверку. Защищает только ограничение в базе.

Что хотят услышать

  • Отличия: NOT NULL, количество, роль для внешних ключей.
  • Поведение NULL в UNIQUE.
  • Суррогатный первичный ключ и бизнес-уникальность отдельно.
  • Гонка при проверке уникальности в коде — плюс.

Частые ошибки

  • Использовать email как первичный ключ.
  • Проверять уникальность только в приложении.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Primary key — основной идентификатор строки, не допускает NULL и один на таблицу; unique лишь гарантирует уникальность
  • ✗Это одно и то же
  • ✗Unique не допускает NULL, а primary key допускает
  • ✗Primary key допускает дубликаты, а unique — нет

Что спросят дальше

  • Что такое foreign key?
  • Когда нужен составной primary key?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем