Ответ
Да, при создании 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 часто определяет физический порядок хранения данных (кластеризацию).
Ответ 18+ 🔞
Да ты посмотри, какая жесть! Ну вот сидишь ты, думаешь: "Создам-ка я себе PRIMARY KEY, чтоб порядок был". А бац — и тебе подсовывают ещё и индекс нахаляву, сука! Как будто в супермаркете акция: "Купи один первичный ключ — получи уникальный индекс в подарок, блядь!"
А если серьёзно, то это не просто так. Представь себе: у тебя таблица employees, и ты туда лепишь столбец id как PRIMARY KEY. Ну, логично же, у каждого работника свой номер, ёпта.
CREATE TABLE employees (
id INT PRIMARY KEY, -- Смотри-ка, а индекс уже тут, как ядрёна вошь!
name VARCHAR(100) NOT NULL
);
И вот СУБД, такая хитрая жопа, сразу думает: "А как я, блядь, буду быстро проверять, что этот id=777 ещё не занят каким-нибудь лодырем? Перебирать всю таблицу? Да ну нахуй, овердохуища времени уйдёт!" Вот она и создаёт индекс — специальную шпаргалку, где всё по порядку лежит. Вставил ты нового — бац, глянула в индекс, и сразу видно, свободен номер или нет.
А ещё, когда другие таблицы начинают на эту ссылаться через FOREIGN KEY, им же тоже удобно должно быть! JOIN'ы делать, целостность проверять. Без индекса это был бы пиздец и тоска, все бы запросы ползали, как черепахи в сиропе.
Но вот что забавно — у всех СУБД свои приколы, блядь:
- В MySQL/InnoDB этот PRIMARY KEY — он вообще главный пацан. Это кластеризованный индекс, то есть все строки на диске физически в его порядке и лежат. Как книги на полке по алфавиту.
- В PostgreSQL он тоже создаёт индекс, но чтобы данные так же упорядочить, надо отдельно команду
CLUSTERшлёпнуть. Немного выёбисто, но что поделать. - А SQL Server вообще по умолчанию делает его кластеризованным, если ты не орёшь "NONCLUSTERED, ёбта!".
И да, это не просто UNIQUE INDEX. PRIMARY KEY — он один, как солнце в небе. NULL в него не запихнёшь, и от него часто весь порядок в таблице пляшет. Короче, мощная хуйня, а не просто ограничение!