В чём разница между первичным ключом (PRIMARY KEY) и внешним ключом (FOREIGN KEY) в реляционной БД?

«В чём разница между первичным ключом (PRIMARY KEY) и внешним ключом (FOREIGN KEY) в реляционной БД?» — вопрос из категории Базы данных и SQL, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Характеристика Первичный ключ (PRIMARY KEY) Внешний ключ (FOREIGN KEY)
Назначение Уникально идентифицирует каждую запись (строку) в своей таблице. Устанавливает и поддерживает связь с записью в другой таблице (или иногда в той же).
Уникальность Значение должно быть уникальным в пределах таблицы. Дублирование запрещено. Значения могут повторяться. Одно значение из родительской таблицы может ссылаться на множество строк в дочерней.
Допустимость NULL Не может содержать значение NULL. Может содержать NULL, если связь не обязательна (зависит от бизнес-логики).
Количество в таблице Только один первичный ключ на таблицу (может состоять из нескольких столбцов — составной ключ). Может быть несколько внешних ключей, ссылающихся на разные таблицы.
Обеспечивает Целостность сущности (Entity Integrity). Целостность ссылок (Referential Integrity).

Практический пример в SQL:

-- Таблица-родитель (сущность "Автор")
CREATE TABLE authors (
    -- PRIMARY KEY: уникальный идентификатор автора
    author_id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL
);

-- Таблица-ребёнок (сущность "Книга")
CREATE TABLE books (
    -- PRIMARY KEY: уникальный идентификатор книги
    book_id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(200) NOT NULL,
    -- FOREIGN KEY: ссылка на автора книги.
    -- Значение author_id ДОЛЖНО существовать в таблице authors.
    author_id INT,
    -- Определение внешнего ключа с именем (good practice)
    CONSTRAINT fk_author
        FOREIGN KEY (author_id)
        REFERENCES authors(author_id)
        ON DELETE CASCADE -- Действие при удалении автора: удалить все его книги
);

-- Вставка данных:
INSERT INTO authors (name) VALUES ('Лев Толстой'); -- author_id = 1
-- Корректная вставка: автор существует.
INSERT INTO books (title, author_id) VALUES ('Война и мир', 1);
-- Ошибка нарушения внешнего ключа: автор с id=99 не существует.
INSERT INTO books (title, author_id) VALUES ('Неизвестная книга', 99);

Проще говоря:

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