Первичный ключ в базах данных принято заполнять автоматически, используя встроенные в базу данных возможности. Такой подход лучше, т.к. это просто реализовать и плюс сама база данных следит за уникальностью во время генерации.
Автогенерация работает по следующим принципам:
- Внутри базы создается отдельный счетчик, который привязывается к каждой таблице.
- Счетчик увеличивается на единицу при вставке новой строки.
- Получившееся значение записывается в поле, которое помечается как автогенерируемое.
Автогенерацию первичного ключа часто называют автоинкрементом (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 — в отличие от предыдущего варианта, этот вариант позволяет добавлять значения самостоятельно