Gymterview
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, а не баг.