Чем primary key отличается от unique-ограничения?
- Сколько первичных ключей может быть у таблицы?
- Может ли UNIQUE-колонка содержать NULL?
Первичный ключ — главный идентификатор строки: уникален, NOT NULL, один на таблицу, на него ссылаются внешние ключи. UNIQUE — дополнительная гарантия уникальности, таких может быть много.
- Оба создают уникальный индекс
- UNIQUE допускает NULL — и несколько NULL (NULL не равен NULL), кроме
NULLS NOT DISTINCTв PostgreSQL 15+ - Первичный ключ — обычно суррогатный (id), UNIQUE — бизнес-уникальность (email, ИНН)
А ещё В InnoDB первичный ключ определяет физический порядок строк
Подробно
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 как первичный ключ.
- Проверять уникальность только в приложении.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Unique не допускает NULL, а primary key допускает
- ✗Primary key допускает дубликаты, а unique — нет
- ✓PK — главный идентификатор: без NULL и один на таблицу; UNIQUE только запрещает дубли
- ✗PK и UNIQUE равнозначны, но PK автоматически становится внешним ключом во всех связанных таблицах
Что спросят дальше
- Что такое foreign key?
- Когда нужен составной primary key?
Разбор темы
- JOIN, ключи и ограничения
INNER/OUTER/CROSS JOIN, ловушка ON vs WHERE, первичные/внешние/уникальные ключи и ссылочная целостность.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.