Найти тему

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

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

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

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

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

До определенного момента механизм автоинкремента был реализован по-своему в каждой СУБД разными способами. Это создавало проблемы при переходе от одной СУБД к другой и усложняло реализацию программного слоя доступа к базе данных.

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

CREATE TABLE users (

id BIGINT GENERATED ALWAYS AS IDENTITY,

username VARCHAR(50),

email VARCHAR(255),

first_name VARCHAR(50),

last_name VARCHAR(50),

created_at TIMESTAMP

);

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

CREATE TABLE users (

-- Одновременное использование и первичного ключа и автогенерации

id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,

username VARCHAR(50),

email VARCHAR(255),

first_name VARCHAR(50),

last_name VARCHAR(50),

created_at TIMESTAMP

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

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

column_name type GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY[ ( sequence_option ) ]

  • Тип данных может быть SMALLINT, INT или BIGINT
  • GENERATED ALWAYS — не позволит добавлять значение самостоятельно, используя UPDATE или INSERT

GENERATED BY DEFAULT — в отличие от предыдущего варианта, этот вариант позволяет добавлять значения самостоятельно