Объясните разницу между Primary Key и Foreign Key в реляционных базах данных.

Ответ

Primary Key (PK, Первичный ключ) и Foreign Key (FK, Внешний ключ) — это основные механизмы обеспечения целостности данных и установления связей между таблицами.

Аспект Primary Key (PK) Foreign Key (FK)
Назначение Уникально идентифицирует каждую запись (строку) в своей таблице. Создает ссылку на запись в другой таблице, устанавливая связь.
Уникальность Значения должны быть уникальными в рамках таблицы. Значения могут повторяться; они не обязаны быть уникальными в своей таблице.
Обязательность Не может содержать NULL значений. Может содержать NULL, если связь не обязательна.
Количество в таблице Только один PK на таблицу (может состоять из нескольких полей — составной ключ). Может быть множество FK, ссылающихся на разные таблицы.

Пример SQL:

-- Таблица-родитель (первичная)
CREATE TABLE Departments (
    department_id INT PRIMARY KEY,         -- PK этой таблицы
    name VARCHAR(100) NOT NULL
);

-- Таблица-потомок (зависимая)
CREATE TABLE Employees (
    employee_id INT PRIMARY KEY,           -- Свой собственный PK
    name VARCHAR(100) NOT NULL,
    department_id INT,                     -- Поле для связи
    -- FK: значение department_id должно существовать в Departments.department_id
    FOREIGN KEY (department_id) REFERENCES Departments(department_id)
);

Почему это важно: FK обеспечивает ссылочную целостность. СУБД не позволит вам:

  1. Вставить в Employees запись с department_id = 999, если такого ID нет в таблице Departments.
  2. Удалить отдел из Departments, если в Employees еще есть сотрудники, ссылающиеся на него (без предварительного указания каскадного действия ON DELETE CASCADE).

Ответ 18+ 🔞

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

Представь себе, что Primary Key (PK) — это твой паспорт, ёпта. Внутренний, сука, документ. Он один на всю таблицу, он уникальный (двух одинаковых номеров паспорта не бывает, ну, в теории), и он обязательный (без паспорта ты — не человек, а так, биомасса). NULL в нём — это как дырка вместо фотографии, так не бывает.

А вот Foreign Key (FK) — это уже справка с работы, блядь. Она не уникальная — таких справок у тебя может быть куча, на разных работодателей. Она может и отсутствовать (NULL), если ты, допустим, безработный бомж. Но главная её фишка — она ссылается на чей-то паспорт. То есть, в этой справке написано: «Работает в отделе №5». И чтобы это было правдой, в природе должен реально существовать отдел с таким номером-паспортом.

Короче, суть:

  • PK — это «кто я». Уникальный и неповторимый.
  • FK — это «где я работаю» или «на кого я ссылаюсь». Просто ссылочка на чужую уникальность.

Вот смотри на код, тут всё наглядно, блядь:

-- Это типа справочник отделов, их паспорта
CREATE TABLE Departments (
    department_id INT PRIMARY KEY,         -- Вот он, ёбаный паспорт отдела! PK!
    name VARCHAR(100) NOT NULL
);

-- А это уже таблица работяг
CREATE TABLE Employees (
    employee_id INT PRIMARY KEY,           -- У каждого работяги свой личный паспорт (PK)
    name VARCHAR(100) NOT NULL,
    department_id INT,                     -- А это его справка о том, в каком он отделе (потенциальный FK)
    -- И вот магия! Этой строчкой мы говорим: "Эй, SQL, слушай сюда!
    -- Циферка в department_id у работяги ДОЛЖНА существовать в паспортах (department_id) таблицы Departments.
    -- Иначе — НИ-НИ!"
    FOREIGN KEY (department_id) REFERENCES Departments(department_id)
);

И вот зачем это всё, этот цирк с конями? А затем, блядь, чтобы не было пиздеца в данных! Это называется «ссылочная целостность». База данных сама, как злой охранник, будет следить, чтобы ты не натворил хуйни.

Например:

  1. Не даст записать в Employees нового сотрудника в отдел №999, если в таблице Departments такого отдела нет. Это как выписать справку, что ты работаешь в «Министерстве ёбнутой магии» — не прокатит.
  2. Не даст просто так удалить отдел из Departments, если в Employees ещё есть люди, которые на него ссылаются. Иначе получится, что люди будут числиться в отделе-призраке, которого уже нет! Пиздец и бардак. (Хотя, если очень хочется, можно настроить каскадное удаление ON DELETE CASCADE, но это уже другая история, там свои грабли).

Вот и вся философия, блядь. PK — чтобы отличать одно от другого. FK — чтобы всё было связано логично, а не как попало. А то без этого начнётся: «Вася работает в отделе “Хуй знает какой”», и прощай, вся аналитика, ебать её в сраку.