Обязательно ли у таблицы в реляционной БД должен быть объявлен первичный ключ (Primary Key)?

«Обязательно ли у таблицы в реляционной БД должен быть объявлен первичный ключ (Primary Key)?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, с точки зрения синтаксиса SQL таблица может существовать без явно объявленного первичного ключа (PK). Однако это считается антипаттерном и нарушает принципы проектирования реляционных баз.

Почему первичный ключ необходим:

  1. Гарантия уникальности: PK предотвращает появление полностью идентичных дубликатов строк.
  2. Обеспечение целостности: Служит надежной точкой для ссылок из внешних ключей (FOREIGN KEY) других таблиц.
  3. Идентификация записи: Позволяет однозначно адресовать и обновлять конкретную строку.
  4. Производительность: В большинстве СУБД создание PK автоматически приводит к созданию кластеризованного или уникального индекса, что значительно ускоряет поиск и соединения (JOIN).

Пример создания таблицы без PK (плохая практика):

CREATE TABLE employee_log (
    employee_name VARCHAR(100),
    action VARCHAR(50),
    timestamp TIMESTAMP
);
-- В эту таблицу можно вставить множество одинаковых строк.

Исправление: добавление первичного ключа. Это может быть:

  • Суррогатный ключ (рекомендуется): Искусственный, уникальный идентификатор.
    ALTER TABLE employee_log ADD COLUMN id BIGSERIAL PRIMARY KEY;
    -- или при создании
    CREATE TABLE employee_log (
    id BIGSERIAL PRIMARY KEY,
    employee_name VARCHAR(100),
    action VARCHAR(50),
    timestamp TIMESTAMP
    );
  • Естественный ключ: Использование одного или нескольких существующих полей, если их комбинация гарантированно уникальна.
    ALTER TABLE employee_log ADD PRIMARY KEY (employee_name, action, timestamp);

    Примечание: В некоторых NoSQL БД (документных, ключ-значение) концепция PK может отсутствовать или быть неявной (например, поле _id в MongoDB).