Что такое первичный ключ (Primary Key) в реляционной базе данных?

«Что такое первичный ключ (Primary Key) в реляционной базе данных?» — вопрос из категории Базы данных, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Основные свойства:

  1. Уникальность: В таблице не может быть двух строк с одинаковым значением первичного ключа.
  2. Отсутствие NULL: Значения в столбцах первичного ключа не могут быть NULL.
  3. Стабильность: Значение PK, как правило, не должно изменяться в течение жизни строки.
  4. Минимальность: PK должен состоять из минимального набора столбцов, необходимых для уникальной идентификации.

Типы первичных ключей:

  • Простые (Simple): Состоят из одного столбца (наиболее распространенный вариант).
  • Составные (Composite): Состоят из двух и более столбцов. Уникальность обеспечивается комбинацией их значений.

Примеры создания в SQL:

-- Простой первичный ключ при создании таблицы
CREATE TABLE Users (
    user_id INT PRIMARY KEY, -- Столбец user_id - PK
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE
);

-- Составной первичный ключ
CREATE TABLE OrderItems (
    order_id INT NOT NULL,
    product_id INT NOT NULL,
    quantity INT,
    PRIMARY KEY (order_id, product_id) -- PK из двух столбцов
);

-- Добавление первичного ключа к существующей таблице
ALTER TABLE Employees ADD CONSTRAINT pk_emp_id PRIMARY KEY (employee_id);

Практическое значение:

  • Связи между таблицами: На первичный ключ ссылается внешний ключ (Foreign Key) другой таблицы, что обеспечивает целостность данных.
  • Индексация: Для PK автоматически создается уникальный индекс (чаще всего кластеризованный), что значительно ускоряет поиск по ключу и операции JOIN.
  • ORM: В таких фреймворках, как Entity Framework (C#) или Hibernate (Java), PK часто используется для отслеживания состояния сущностей (Entity State).