Gymterview
junior

Чем отличаются типы serial и bigserial от явного использования последовательностей?

serial и bigserial — это псевдотипы (не настоящие типы данных), которые являются сокращённой записью для создания столбца с автоинкрементом. За кулисами PostgreSQL создаёт последовательность и привязывает её к столбцу.

Запись:

Пример
CREATE TABLE users (
    id serial PRIMARY KEY
);

Эквивалентна:

Пример
CREATE SEQUENCE users_id_seq;
CREATE TABLE users (
    id integer NOT NULL DEFAULT nextval('users_id_seq')
);
ALTER SEQUENCE users_id_seq OWNED BY users.id;

Различия serial, bigserial, smallserial

Псевдотип Реальный тип Размер Макс. значение
smallserial smallint 2 байта 32 767
serial integer 4 байта 2 147 483 647
bigserial bigint 8 байт 9 223 372 036 854 775 807

Рекомендация (PostgreSQL 10+)

Использовать GENERATED ALWAYS AS IDENTITY вместо serial, потому что:

  • это стандарт SQL
  • запрещает явную вставку значения без OVERRIDING SYSTEM VALUE
  • последовательность автоматически привязана к столбцу
Пример
-- Современный подход
CREATE TABLE users (
    id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    email text NOT NULL
);

-- Если нужно вставить конкретное значение (миграция данных):
INSERT INTO users (id, email)
OVERRIDING SYSTEM VALUE
VALUES (999, 'admin@bank.ru');

На собеседовании: покажите знание эволюции подходов: serial -> GENERATED ALWAYS AS IDENTITY. Объясните, что serial — это PostgreSQL-специфичный псевдотип, а IDENTITY — стандарт SQL, который вдобавок защищает от случайной вставки произвольного значения.