В чем разница между первичным (PRIMARY) и внешним (FOREIGN) ключом в базе данных?

Ответ

Эти ключи служат разным, но взаимосвязанным целям в реляционной модели данных.

Первичный ключ (PRIMARY KEY) — это столбец (или группа столбцов), который однозначно идентифицирует каждую строку в своей таблице.

Свойства:

  • Уникальность: Значение должно быть уникальным для каждой записи.
  • NOT NULL: Не может содержать NULL.
  • Один на таблицу: В таблице может быть только один PRIMARY KEY.
  • Индекс: Создает кластеризованный (чаще всего) или некластеризованный индекс для быстрого поиска.
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY, -- Первичный ключ
    email VARCHAR(255) UNIQUE NOT NULL,
    name VARCHAR(100)
);

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

Свойства:

  • Ссылочная целостность: Гарантирует, что значение во внешнем ключе соответствует существующей записи в связанной (родительской) таблице.
  • Может быть NULL: Если связь необязательна.
  • Несколько на таблицу: В таблице может быть много FOREIGN KEY.
  • Ограничения (CONSTRAINTS): Определяют поведение при удалении или обновлении родительской записи (ON DELETE CASCADE, ON UPDATE SET NULL и т.д.).
CREATE TABLE orders (
    id INT PRIMARY KEY,
    user_id INT, -- Этот столбец будет внешним ключом
    total DECIMAL(10,2),
    FOREIGN KEY (user_id) REFERENCES users(id) -- Связь с таблицей users
        ON DELETE CASCADE -- При удалении пользователя удалятся его заказы
);

Итог: PRIMARY KEY обеспечивает уникальность внутри таблицы, а FOREIGN KEY — целостность связей между таблицами.

Ответ 18+ 🔞

Давай разжую, как есть, про эти ваши ключи, а то смотрю — у некоторых в глазах уже туман. Представь, что у тебя есть бар.

Первичный ключ (PRIMARY KEY) — это как татуха на жопе у каждого посетителя. Уникальная, нихуя не повторяется, и без неё тебя в заведение просто не пустят. Это твой главный и единственный пропуск.

Что он из себя представляет, этот красавец:

  • Один такой на районе: Двух одинаковых номеров на двух задницах быть не может. Уникальность, блядь, полная.
  • Пустым не бывает: NULL — это проёб, так не работает. Номер есть всегда.
  • Один царь в царстве: В одной таблице такой пахан может быть только один.
  • Всё быстро ищет: База данных по нему сразу всё индексирует, чтобы не рыться, как в помойке.
CREATE TABLE посетители (
    id INT AUTO_INCREMENT PRIMARY KEY, -- Вот он, король, татуха-идентификатор
    email VARCHAR(255) UNIQUE NOT NULL,
    имя VARCHAR(100)
);

Внешний ключ (FOREIGN KEY) — это уже история поинтереснее. Это как чек из нашего бара, который официантка приносит. На этом чеке написано: «Счёт для посетителя №15». И этот номер ссылается на ту самую татуху на жопе в таблице посетители. Без реального посетителя №15 — чек пиздец как подозрительный, да?

В чём его сила и мощь:

  • Порядок навел: Он следит, чтобы ты не приписал заказ какому-то левому челу, которого в базе нет. Целостность связей, ёпта.
  • Может и отсутствовать: Иногда чек «на стол» — без привязки к конкретному челу (NULL).
  • Их дохуя может быть: На одного посетителя может быть куча чеков (заказов). Поэтому внешних ключей в таблице — овердохуища.
  • Умный дохуя: Можно настроить, что будет, если посетителя (родительскую запись) удалить. Удалили чувака — все его чеки автоматом в утиль (ON DELETE CASCADE). Удобно, пиздец.
CREATE TABLE заказы (
    id INT PRIMARY KEY,
    посетитель_id INT, -- А вот и ссылочка на татуху! Будущий внешний ключ.
    сумма DECIMAL(10,2),
    FOREIGN KEY (посетитель_id) REFERENCES посетители(id) -- Чёткая привязка
        ON DELETE CASCADE -- Чувака выгнали — все его долги списались, красота!
);

Короче, суть: PRIMARY KEY — это твоё уникальное, нихуя не повторяющееся удостоверение личности внутри твоей палаты. А FOREIGN KEY — это бумажка между палатами, которая кричит: «Эй, смотри, я принадлежу вот этому конкретному мудаку из соседней комнаты!». Первый обеспечивает порядок у себя дома, второй — не даёт насрать в коридоре, сохраняя связи.