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, который вдобавок защищает от случайной вставки произвольного значения.