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