Первичный ключ (PK) и внешний ключ (FK)
Зачем это нужно
Чтобы связи между таблицами работали надёжно, в реляционных базах данных используют два специальных типа колонок — первичный ключ и внешний ключ. Без них невозможно написать JOIN.
Первичный ключ (Primary Key, PK)
Первичный ключ — это колонка (или набор колонок), которая уникально идентифицирует каждую строку в таблице. Правила:
- Значение уникально для каждой строки
- Значение не может быть NULL
- В таблице только один первичный ключ
В нашей базе данных первичный ключ — это всегда колонка id:
-- Посмотреть id нескольких клиентов
SELECT id, first_name, last_name FROM customers LIMIT 5;
id │ first_name │ last_name
────┼────────────┼──────────
1 │ Алексей │ Смирнов
2 │ Мария │ Иванова
3 │ Дмитрий │ Козлов
4 │ Анна │ Новикова
5 │ Сергей │ Попов
Каждый id уникален — нет двух клиентов с одинаковым номером.
Внешний ключ (Foreign Key, FK)
Внешний ключ — колонка в одной таблице, которая ссылается на первичный ключ другой таблицы. Он создаёт связь между таблицами.
-- Посмотреть customer_id в заказах
SELECT id, customer_id, total_amount FROM orders LIMIT 5;
id │ customer_id │ total_amount
────┼─────────────┼─────────────
1 │ 1 │ 90 680₽
2 │ 2 │ 2 570₽
3 │ 3 │ 5 990₽
4 │ 4 │ 3 870₽
5 │ 5 │ 1 490₽
customer_id — это внешний ключ: он ссылается на id в таблице customers.
Заказ с customer_id = 1 принадлежит Алексею Смирнову.
Схема связей нашей базы данных
categories products order_items orders customers
────────── ──────────── ─────────── ────────── ──────────
id ←────────── category_id order_id ──────→ id id
name id ←─────────────────── product_id customer_id ──→ first_name
name quantity status last_name
price price_at_purchase total_amount email
stock created_at city
id ←──────────── order_id
deliveries
Стрелка → означает: «ссылается на».
Как найти связь в реальной базе
- Ищи колонки с суффиксом
_id— почти всегда внешний ключ - Найди таблицу, на которую она ссылается (обычно это имя таблицы без
_id) order_id→ таблицаorders,product_id→ таблицаproducts
Частые ошибки
- «Не могу понять, какая таблица с какой связана» — смотри на имена колонок.
Колонка
category_idвproductsссылается наidвcategories. - «Путаю PK и FK» — PK всегда
id(уникален в своей таблице), FK —*_id(ссылается наidдругой таблицы).
Запомни
PK (id) — уникальный номер строки в таблице.
FK (*_id) — ссылка на PK другой таблицы. По FK строим JOIN.
Прочитайте урок до конца — прогресс засчитается автоматически