9.17. Функции для работы с последовательностями
В этом разделе описаны функции для работы с объектами, представляющими последовательности. Такие объекты (также называемыми генераторами последовательностей или просто последовательностями) являются специальными таблицами из одной строки и создаются командой CREATE SEQUENCE. Используются они обычно для получения уникальных идентификаторов строк таблицы. Функции, перечисленные в Таблице 9.50, предоставляют простые и безопасные для параллельного использования методы получения очередных значений таких последовательностей.
Таблица 9.50. Функции для работы с последовательностями
Функция Описание |
|---|
Продвигает объект последовательности к следующему значению и возвращает это значение. Это действие атомарно: даже если вызвать Этой функции требуется право |
Устанавливает для объекта последовательности текущее значение и может также установить флаг SELECT setval('myseq', 42); При следующем вызове Результатом Этой функции требуется право |
Возвращает значение, выданное при последнем вызове Этой функции требуется право |
Возвращает значение, выданное при последнем вызове Этой функции требуется право |
Внимание
Во избежание блокирования параллельных транзакций, пытающихся получить значения одной последовательности, операция nextval никогда не откатывается; то есть, как только значение было выбрано, оно считается использованным и не будет возвращено снова. Это утверждение верно, даже когда окружающая транзакция впоследствии прерывается или вызывающий запрос никак не использует это значение. Например, команда INSERT с предложением ON CONFLICT вычислит кортеж, претендующий на добавление, произведя все требуемые вызовы nextval, прежде чем выявит конфликты, которые могут привести к отработке правил ON CONFLICT вместо добавления. В таких ситуациях в последовательности задействованных значений могут образовываться «дыры». Таким образом, объекты последовательностей PostgreSQL не годятся для получения непрерывных последовательностей.
В том же ключе любые изменения состояния последовательности, произведённые функцией setval, не отменяются при откате транзакции.
Вышеописанные функции, работающие с таблицами или индексами, принимают аргумент типа regclass, который представляет собой просто OID таблицы или индекса в системном каталоге pg_class. Однако вам не нужно вручную вычислять OID, так как процедура ввода значения regclass может сделать это за вас. За подробностями обратитесь к Разделу 8.19.