Создаёт ли ограничение PRIMARY KEY в SQL индекс?

«Создаёт ли ограничение PRIMARY KEY в SQL индекс?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, при создании PRIMARY KEY в большинстве СУБД автоматически создаётся уникальный индекс. Этот индекс обеспечивает быстрый поиск по первичному ключу и гарантирует его ограничения.

Почему это происходит:

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

Пример и особенности:

CREATE TABLE employees (
    id INT PRIMARY KEY,         -- Автоматически создаст уникальный индекс
    name VARCHAR(100) NOT NULL
);

Важные нюансы в зависимости от СУБД:

  • MySQL/InnoDB: PRIMARY KEY — это кластеризованный индекс (clustered index). Данные таблицы физически упорядочены на диске по этому индексу.
  • PostgreSQL: PRIMARY KEY создаёт уникальный B-дерево индекс. По умолчанию таблица упорядочена по oid, но можно создать кластеризованную таблицу по первичному ключу командой CLUSTER.
  • SQL Server: PRIMARY KEY по умолчанию создаёт кластеризованный уникальный индекс (если явно не указан NONCLUSTERED).

Отличие от обычного UNIQUE индекса:

  • В таблице может быть только один PRIMARY KEY.
  • Столбцы PRIMARY KEY не могут содержать NULL значений.
  • PRIMARY KEY часто определяет физический порядок хранения данных (кластеризацию).