Собесов

Какие ограничения накладывает PRIMARY KEY

SQLРеляционная модельЛёгкаяJunior

Условие

Какие ограничения накладывает PRIMARY KEY на таблицу?

Решение

PRIMARY KEY = UNIQUE + NOT NULL + кластерный/B-tree индекс (обычно).

Ограничение Что значит
Уникальность Никакие две строки не могут иметь одинаковое значение PK
NOT NULL Колонка(и) PK не могут быть NULL
Один на таблицу В стандартном SQL только один PK; но он может быть составным
Автоиндекс СУБД автоматически создаёт уникальный индекс по PK
Целевой ключ для FK FOREIGN KEY ссылается на PK другой таблицы

Составной PRIMARY KEY

CREATE TABLE order_items (
  order_id   INT,
  product_id INT,
  qty        INT,
  PRIMARY KEY (order_id, product_id)  -- обе колонки вместе уникальны
);

Это позволяет хранить одну строку на пару (заказ, товар) без отдельного id.

PK vs UNIQUE

PRIMARY KEY UNIQUE
Уникальность Да Да
NULL Запрещён Допускается (один или несколько NULL — зависит от СУБД)
Сколько на таблицу Один Сколько угодно
Целевой для FK Да Да (если SQL-стандарт поддерживает)

В PostgreSQL UNIQUE допускает несколько NULL (NULL не равен ничему, включая другой NULL).

Поведение при INSERT

CREATE TABLE t (id INT PRIMARY KEY);
INSERT INTO t VALUES (1);
INSERT INTO t VALUES (1);   -- error: duplicate key
INSERT INTO t VALUES (NULL); -- error: null value in column "id"

Surrogate vs natural PK

В DWH для измерений (dim) всегда используют surrogate (BIGSERIAL/UUID), потому что:

  • Бизнес-ключ может меняться (email, паспорт).
  • В SCD-2 одна сущность хранится в нескольких строках с одним бизнес-ключом — он не уникален. PK здесь — surrogate.

Подводные камни

  1. (NULL, 1) в составном PK — запрещён, потому что NOT NULL распространяется на каждую колонку.
  2. Производительность INSERT — каждый INSERT обновляет PK-индекс. Большие batch'и медленнее на партиционированных таблицах с глобальным PK.
  3. AUTO_INCREMENT дыры — после ROLLBACK или DELETE номера не переиспользуются. Это нормально.
  4. Изменение PK — почти всегда боль: каскадные обновления FK, перестроение индексов. Лучше surrogate, который никогда не меняется.

Эталонный ответ

PRIMARY KEY обеспечивает: уникальность, NOT NULL, один PK на таблицу (но может быть составным), автоматический индекс. Это основа ссылочной целостности через FOREIGN KEY.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти