Ответ
Да, в подавляющем большинстве реляционных СУБД при создании ограничения PRIMARY KEY автоматически создается уникальный индекс. Это необходимо для обеспечения уникальности и быстрого поиска по первичному ключу.
Как это работает в разных СУБД:
- MySQL / PostgreSQL / SQLite: Создается
UNIQUE INDEXс тем же именем, что и у первичного ключа.CREATE TABLE users ( id INT PRIMARY KEY, -- Автоматически создаст уникальный индекс на id name VARCHAR(100) ); - Oracle: Также автоматически создается уникальный индекс. Можно явно указать табличное пространство для индекса.
- SQL Server: По умолчанию создается кластерный индекс (clustered index), что означает, что данные в таблице физически упорядочены по первичному ключу. Это можно изменить, указав
NONCLUSTERED.CREATE TABLE users ( id INT PRIMARY KEY NONCLUSTERED, -- Явно создаст некластерный индекс name VARCHAR(100) );
Практические следствия:
- Не создавайте индекс вручную: Дополнительный индекс
CREATE INDEX idx_id ON users(id)будет избыточным и станет бесполезной нагрузкой на систему при вставке/обновлении. - В JPA/Hibernate: При использовании
@Idили@EmbeddedIdдля определения первичного ключа, создаваемая схема БД также будет содержать соответствующий индекс (если DDL-генерация включена). - Составной первичный ключ: Для
PRIMARY KEY (col1, col2)также создается составной уникальный индекс на(col1, col2).
Исключение: Некоторые СУБД (как старые версии) или особые конфигурации могут требовать явного создания индекса, но в современной Java-экосистеме это крайне редкий случай.