SQL
2026-02-26 16:47 Diff

Ранее мы создавали идентификаторы вручную. Так можно делать в учебных целях, но в реальной жизни эту задачу берут на себя СУБД. За это отвечает механизм автогенерации. В этом уроке мы рассмотрим основной принцип этого механизма, а также разберем, что такое первичный ключ и как он помогает идентифицировать строки.

Первичный ключ

Первичный ключ однозначно идентифицирует каждую запись внутри таблицы. Задается с помощью фразы PRIMARY KEY, которая добавляется после указания типа, когда создается таблица. Первичный ключ в таблице может быть только один, и для него используется отдельное поле -- идентификатор, у которого нет физического смысла:

View on DBFiddle

Если вставить новую запись со значением, которое уже есть в колонке с первичным ключом, то запрос не выполнится.

Автогенерация первичного ключа

Первичный ключ в базах данных принято заполнять автоматически, используя встроенные в базу данных возможности. Такой подход лучше ручного заполнения по двум причинам. Во-первых, это просто реализовать. Во-вторых, база данных сама следит за уникальностью во время генерации.

Автогенерация работает по следующим принципам:

  1. Внутри базы создается отдельный счетчик, который привязывается к каждой таблице.
  2. Счетчик увеличивается на единицу при вставке новой строки.
  3. Получившееся значение записывается в поле, которое помечается как автогенерируемое.

Автогенерацию первичного ключа часто называют автоинкрементом (autoincrement). Что переводится как автоматическое увеличение и напоминает операцию инкремента из программирования ++.

Такой автоинкремент создается с помощью GENERATED ALWAYS AS IDENTITY:

Основной ключ и автоинкремент часто используются вместе:

View On DBFiddle

Если удалить запись с id равным двум и вставить еще одну запись, то значением поля id будет 4.

View On DBFiddle

Автогенерация не связана с данными в таблице. Это отдельный счетчик, который всегда увеличивается. Так избегаются вероятные коллизии и ошибки, когда один и тот же идентификатор принадлежит сначала одной записи, а потом другой.

Вот его сигнатура из документации:

  • Тип данных может быть SMALLINT, INT или BIGINT
  • GENERATED ALWAYS -- не позволит добавлять значение самостоятельно, используя UPDATE или INSERT
  • GENERATED BY DEFAULT -- в отличие от предыдущего варианта, этот вариант позволяет добавлять значения самостоятельно

PostgreSQL позволяет иметь более одного автогенерируемого поля на таблицу.

Ниже пример создания таблицы с помощью GENERATED BY DEFAULT AS IDENTITY

View On DBFiddle

Выводы

В этом уроке мы узнали про первичные ключи. Использование первичных ключей в SQL помогает обеспечить целостность данных в базе. Первичные ключи помогают уникально идентифицировать записи в таблице.

Механизм автоинкремента позволяет автоматически увеличивать значения ключей при каждой новой записи, что делает его простым в использовании и предотвращает возможные конфликты и ошибки.