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

«В чем разница между первичным (PRIMARY) и внешним (FOREIGN) ключом в базе данных?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Первичный ключ (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 — целостность связей между таблицами.