Ответ
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 обеспечивает ссылочную целостность. СУБД не позволит вам:
- Вставить в
Employeesзапись сdepartment_id = 999, если такого ID нет в таблицеDepartments. - Удалить отдел из
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)
);
И вот зачем это всё, этот цирк с конями? А затем, блядь, чтобы не было пиздеца в данных! Это называется «ссылочная целостность». База данных сама, как злой охранник, будет следить, чтобы ты не натворил хуйни.
Например:
- Не даст записать в
Employeesнового сотрудника в отдел №999, если в таблицеDepartmentsтакого отдела нет. Это как выписать справку, что ты работаешь в «Министерстве ёбнутой магии» — не прокатит. - Не даст просто так удалить отдел из
Departments, если вEmployeesещё есть люди, которые на него ссылаются. Иначе получится, что люди будут числиться в отделе-призраке, которого уже нет! Пиздец и бардак. (Хотя, если очень хочется, можно настроить каскадное удалениеON DELETE CASCADE, но это уже другая история, там свои грабли).
Вот и вся философия, блядь. PK — чтобы отличать одно от другого. FK — чтобы всё было связано логично, а не как попало. А то без этого начнётся: «Вася работает в отделе “Хуй знает какой”», и прощай, вся аналитика, ебать её в сраку.