SQLLab
Теория· 8 мин· 10 XP

Первичный ключ (PK) и внешний ключ (FK)

Зачем это нужно

Чтобы связи между таблицами работали надёжно, в реляционных базах данных используют два специальных типа колонок — первичный ключ и внешний ключ. Без них невозможно написать JOIN.

Первичный ключ (Primary Key, PK)

Первичный ключ — это колонка (или набор колонок), которая уникально идентифицирует каждую строку в таблице. Правила:

  • Значение уникально для каждой строки
  • Значение не может быть NULL
  • В таблице только один первичный ключ

В нашей базе данных первичный ключ — это всегда колонка id:

sql
-- Посмотреть 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)

Внешний ключ — колонка в одной таблице, которая ссылается на первичный ключ другой таблицы. Он создаёт связь между таблицами.

sql
-- Посмотреть 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

Стрелка → означает: «ссылается на».

Как найти связь в реальной базе

  1. Ищи колонки с суффиксом _id — почти всегда внешний ключ
  2. Найди таблицу, на которую она ссылается (обычно это имя таблицы без _id)
  3. 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.

Прочитайте урок до конца — прогресс засчитается автоматически