Условие
Какие ограничения накладывает 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.
Подводные камни
(NULL, 1)в составном PK — запрещён, потому чтоNOT NULLраспространяется на каждую колонку.- Производительность INSERT — каждый INSERT обновляет PK-индекс. Большие batch'и медленнее на партиционированных таблицах с глобальным PK.
AUTO_INCREMENTдыры — послеROLLBACKилиDELETEномера не переиспользуются. Это нормально.- Изменение PK — почти всегда боль: каскадные обновления FK, перестроение индексов. Лучше surrogate, который никогда не меняется.
Эталонный ответ
PRIMARY KEY обеспечивает: уникальность, NOT NULL, один PK на таблицу (но может быть составным), автоматический индекс. Это основа ссылочной целостности через FOREIGN KEY.