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

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

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

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

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

Функция

Описание

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 или SELECT для последовательности.

lastval () → bigint

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

Эта функция требует привилегий USAGE или SELECT на последовательности, которая была использована последней.


Предостережение

Чтобы избежать блокировки параллельных транзакций, которые получают числа из одной и той же последовательности, значение, полученное с помощью функции nextval, не возвращается для повторного использования, если вызывающая транзакция позже отменяется. Это означает, что отмена транзакции или сбой базы данных могут привести к пропускам в последовательности присвоенных значений. Это также может произойти без отмены транзакции. Например, INSERT с предложением ON CONFLICT вычислит кортеж, который будет вставлен, включая выполнение любых необходимых вызовов функции nextval, прежде чем обнаружить любое конфликтное правило ON CONFLICT. Таким образом, объекты последовательностей Tantor SE не могут использоваться для получения последовательностей без пропусков.

Точно так же, изменения состояния последовательности, сделанные с помощью функции setval, немедленно видны другим транзакциям и не отменяются, если вызывающая транзакция откатывается.

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

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