Функции для управления последовательностями

В этом разделе описываются функции для работы с объектами последовательности, также называемыми генераторами последовательностей или просто последовательностями. Объекты последовательности — это специальные однострочные таблицы, созданные с помощью команды CREATE SEQUENCE. Эти объекты обычно используются для генерирования уникальных идентификаторов для строк таблицы. Функции для последовательностей, перечисленные в Таблице 50, предоставляют простые и безопасные для одновременного использования методы получения значений последовательности из таких объектов.

Таблица 50. Функции для последовательностей

Функция

Описание

nextval ( regclass ) → bigint

Продвигает объект последовательности к его следующему значению и возвращает это значение. Это происходит атомарно: даже если nextval выполняется параллельно в нескольких сеансах, в каждом вызове будет беспрепятственно получено отдельное значение последовательности. Если объект последовательности был создан с параметрами по умолчанию, при последующих вызовах nextval будут возвращаться следующие по порядку значения, начиная с 1. Изменить это поведение можно с помощью соответствующих параметров команды CREATE SEQUENCE.
Этой функции требуется право USAGE или UPDATE для последовательности.

setval ( regclass, bigint [, boolean ] ) → bigint

Устанавливает для объекта последовательности текущее значение и при необходимости флаг is_called. Форма с двумя параметрами устанавливает у последовательности заданное значение в поле last_value, а также устанавливает в поле is_called значение true, подразумевая, что при следующем вызове nextval последовательность продвинется к очередному значению, после чего вернет его. При этом currval также выдаст заданное значение. В форме с тремя параметрами в поле is_called можно установить true или false. У значения true будет тот же эффект, что и в форме с двумя параметрами. Если же присвоено значение false, то при первом вызове nextval после этого вернется именно заданное значение, а продвижение последовательности произойдет при следующем вызове nextval. Более того, в этом случае значение, выдаваемое currval, не изменится. Например:


    SELECT setval('myseq', 42);           При следующем вызове nextval вернется 43
    SELECT setval('myseq', 42, true);     То же самое
    SELECT setval('myseq', 42, false);    При следующем вызове nextval вернется 42

Результатом, возвращаемым setval, является просто значение ее второго аргумента.
Этой функции требуется право UPDATE для последовательности.

currval ( regclass ) → bigint

Возвращает значение, полученное при последнем вызове nextval для этой последовательности в текущем сеансе. (Если nextval никогда не вызывалась для этой последовательности в этом сеансе, будет выдана ошибка.) Поскольку возвращаемое значение ограничено рамками сеанса, данная функция выдает предсказуемый ответ, независимо от того, выполнялась ли потом nextval в других сеансах или нет.
Этой функции требуется право USAGE или UPDATE для последовательности.

lastval () → bigint

Возвращает значение, выданное при последнем вызове nextval в текущем сеансе. Эта функция идентична currval, за исключением того, что она не принимает в качестве аргумента имя последовательности, а обращается к той последовательности, к которой в последний раз в текущем сеансе применялась nextval. Если nextval в текущем сеансе еще не вызывалась, то при вызове lastval возникнет ошибка.
Этой функции требуется право USAGE или UPDATE для последней использованной последовательности.

ВНИМАНИЕ!
Во избежание блокировки параллельных транзакций, получающих числа из одной последовательности, значение, полученное функцией nextval, не освобождается обратно для повторного использования, если вызывающая транзакция впоследствии прерывается. Это означает, что прерывание транзакции или сбой базы данных могут привести к появлению пропусков в последовательности задействованных значений. Это может случиться и без прерывания транзакции. Например, команда INSERT с предложением ON CONFLICT вычислит добавляемый кортеж, в том числе произведя все необходимые вызовы nextval, а потом обнаружит какой-нибудь конфликт, из-за которого, возможно, вместо добавления будет следовать правилу ON CONFLICT. Таким образом объекты последовательности QHB нельзя использовать для получения «сплошных» последовательностей.

Аналогично изменения состояния последовательности, произведенные функцией setval, немедленно становятся видимыми для других транзакций и не отменяются при откате транзакции, вызвавшей эту функцию.

Если сбой кластера баз данных происходит до фиксации транзакции, содержащей вызов nextval или setval, изменение состояния последовательности может не попасть в постоянное хранилище, поэтому неизвестно, в каком состоянии будет находиться последовательность после перезапуска кластера: оригинальном или измененном. Это безвредно при использовании последовательности внутри базы данных, поскольку другие эффекты незафиксированных транзакции тоже не будут видны. Однако если вы хотите постоянно использовать значение последовательности вне базы данных, предварительно убедитесь, что вызов nextval был зафиксирован.

Последовательность, которой должна управлять функция для последовательностей, задается аргументом regclass, представляющим собой просто OID последовательности в системном каталоге pg_class. Однако нет необходимости искать этот OID вручную, так как преобразователь вводимого значения типа regclass сделает всю работу за вас. Подробную информацию см. в разделе Типы идентификаторов объектов.