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

Ответ

Да, при создании 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 часто определяет физический порядок хранения данных (кластеризацию).

Ответ 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 в него не запихнёшь, и от него часто весь порядок в таблице пляшет. Короче, мощная хуйня, а не просто ограничение!