Что такое Primary Key (Первичный ключ) в SQL?

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

Ответ

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

Ключевые свойства первичного ключа:

  1. Уникальность: В таблице не может быть двух строк с одинаковым значением первичного ключа.
  2. Непустота (NOT NULL): Поле первичного ключа не может содержать значение NULL.
  3. Только один на таблицу: У таблицы может быть только один первичный ключ (хотя он может состоять из нескольких столбцов — составной ключ).

Зачем он нужен и как я его использовал:

  • Гарантия целостности данных: База данных не позволит вставить дубликат или NULL в PK. Это защищает от логических ошибок в данных.
  • Связи между таблицами (FOREIGN KEY): PK является «якорем» для внешних ключей из других таблиц, что позволяет строить связи.
  • Кластеризованные индексы: В большинстве СУБД (SQL Server, MySQL/InnoDB) PK по умолчанию создаёт кластеризованный индекс — данные в таблице физически упорядочены по этому ключу, что ускоряет поиск и range-запросы.

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

-- Простой первичный ключ на один столбец (часто автоинкрементный)
CREATE TABLE Users (
    user_id INT PRIMARY KEY IDENTITY(1,1), -- SQL Server
    -- user_id SERIAL PRIMARY KEY,        -- PostgreSQL
    -- user_id INT AUTO_INCREMENT PRIMARY KEY, -- MySQL
    email VARCHAR(255) NOT NULL UNIQUE
);

-- Составной первичный ключ (Composite Primary Key)
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_Employees PRIMARY KEY (employee_id);

Важно: Выбор хорошего PK (суррогатный vs. естественный) — это важное архитектурное решение, влияющее на производительность и дизайн схемы.