junior
Что такое последовательности (sequences) и как они работают?
Последовательность (sequence) — это специальный объект базы данных, генерирующий уникальные числовые значения в возрастающем (или убывающем) порядке. Последовательности часто используются для генерации первичных ключей.
Примеры работы с последовательностями
-- Создание последовательности
CREATE SEQUENCE order_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 20;
-- Получение следующего значения
SELECT nextval('order_id_seq'); -- 1
SELECT nextval('order_id_seq'); -- 2
-- Текущее значение (в текущей сессии, после вызова nextval)
SELECT currval('order_id_seq'); -- 2
-- Последнее присвоенное значение (глобально)
SELECT last_value FROM order_id_seq;
-- Использование в таблице
CREATE TABLE orders (
id bigint DEFAULT nextval('order_id_seq') PRIMARY KEY,
description text
);
Важные особенности
- Последовательности работают вне транзакций — если транзакция откатывается, значение последовательности не возвращается. Поэтому в значениях могут быть пропуски (gaps), и это нормальное поведение
- Параметр
CACHEпозволяет каждой сессии заранее резервировать блок значений, что повышает производительность при высоком конкурентном доступе - Последовательности гарантируют уникальность, но не гарантируют непрерывность
Пример
-- Сброс последовательности
ALTER SEQUENCE order_id_seq RESTART WITH 1;
-- Привязка последовательности к столбцу
ALTER SEQUENCE order_id_seq OWNED BY orders.id;
На собеседовании: типичный вопрос-ловушка — «почему в таблице пропуски в id?». Ответ: последовательности работают вне транзакций, откат транзакции не возвращает значение. Это by design, а не баг.