Ответ
Да, при создании PRIMARY KEY в большинстве СУБД автоматически создаётся уникальный индекс. Этот индекс обеспечивает быстрый поиск по первичному ключу и гарантирует его ограничения.
Почему это происходит:
- Для обеспечения уникальности: СУБД нужен эффективный способ проверки, не существует ли уже строка с таким ключом, при каждой вставке или обновлении. Индекс решает эту задачу.
- Для обеспечения ссылочной целостности (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 часто определяет физический порядок хранения данных (кластеризацию).