Документация по PostgreSQL 9.4.1 | |||
---|---|---|---|
Пред. | Уровень выше | Глава 9. Функции и операторы | След. |
9.16. Функции для работы с последовательностями
В этом разделе описаны функции для работы с объектами, представляющими последовательности. Такие объекты (также называемыми генераторами последовательностей или просто последовательностями) являются специальными таблицами из одной строки и создаются командой CREATE SEQUENCE. Используются они обычно для получения уникальных идентификаторов строк таблицы. Функции, перечисленные в Таблице 9-44, предоставляют простые и безопасные для параллельного использования методы получения очередных значений таких последовательностей.
Таблица 9-44. Функции для работы с последовательностями
Функция | Тип результата | Описание |
---|---|---|
currval(regclass) | bigint | Выдаёт значение заданной последовательности, которое было возвращено при последнем вызове функции nextval |
lastval() | bigint | Выдаёт значение любой последовательности, которое было возвращено при последнем вызове функции nextval |
nextval(regclass) | bigint | Продвигает последовательность к следующему значению и возвращает его |
setval(regclass, bigint) | bigint | Устанавливает текущее значение последовательности |
setval(regclass, bigint, boolean) | bigint | Устанавливает текущее значение последовательности и флаг is_called, указывающий на то, что это значение использовалось |
Последовательность, к которой будет обращаться одна из этих функций, определяется аргументом regclass, задающим просто OID последовательности в системном каталоге pg_class. Вычислять этот OID вручную не нужно, так как процедура ввода данных regclass автоматически выполнит эту работу за вас. Просто запишите имя последовательности в апострофах, чтобы оно выглядело как строковая константа. Для совместимости с обычными именами SQL эта строка будет переведена в нижний регистр, если только она не заключена в кавычки. Например:
nextval('foo') обращается к последовательности foo nextval('FOO') обращается к последовательности foo nextval('"Foo"') обращается к последовательности Foo
При необходимости имя последовательности можно дополнить именем схемы:
nextval('myschema.foo') обращается к myschema.foo nextval('"myschema".foo') то же самое nextval('foo') ищет foo в пути поиска
Подробнее тип regclass описан в Разделе 8.18.
Замечание: В PostgreSQL до версии 8.1 аргументы этих функций имели тип text, а не regclass, и поэтому описанное выше преобразование текстовой строки в OID имело место при каждом вызове функции. Это поведение сохраняется и сейчас для обратной совместимости, но сейчас оно реализовано как неявное приведение типа text к типу regclass перед вызовом функции.
Когда вы записываете аргумент функции, работающей с последовательностью, как текстовую строку в чистом виде, она становится константой типа regclass. Так как фактически это будет просто значение OID, оно будет привязано к изначально идентифицированной последовательности, несмотря на то, что она может быть переименована, перенесена в другую схему и т. д. Такое "раннее связывание" обычно желательно для ссылок на последовательности в значениях колонок по умолчанию и представлениях. Но иногда возникает необходимость в "позднем связывании", когда ссылки на последовательности распознаются в процессе выполнения. Чтобы получить такое поведение, нужно принудительно изменить тип константы с regclass на text:
nextval('foo'::text) foo распознаётся во время выполненияЗаметьте, что версии PostgreSQL до 8.1 поддерживали только позднее связывание, так что это может быть полезно и для совместимости со старыми приложениями.
Конечно же, аргументом таких функций может быть не только константа, но и выражение. Если это выражение текстового типа, неявное приведение типов повлечёт разрешение имени во время выполнения.
Ниже описаны все функции, предназначенные для работы с последовательностями:
nextval
Продвигает последовательность к следующему значению и возвращает его. Это атомарная операция: если
nextval
вызывается одновременно в нескольких сеансах, в результате каждого вызова будут гарантированно получены разные значения.Если последовательность создаётся с параметрами по умолчанию, успешные вызовы
nextval
получают очередные значения по возрастанию, начиная с 1. Другое поведение можно получить с помощью специальных параметров в команде CREATE SEQUENCE; подробнее это описано на странице описания команды.Важно: Во избежания блокирования параллельных транзакций, пытающихся получить значения одной последовательности, операция
nextval
никогда не откатывается; т. е., как только значение было выбрано, оно считается использованным, даже если транзакция, выполнившаяnextval
, позже будет прервана. Это означает, что прерванные транзакции могут оставлять "дыры" в последовательности задействованных значений.currval
Возвращает значение, выданное при последнем вызове
nextval
для этой последовательности в текущем сеансе. (Если в данном сеансеnextval
ни разу не вызывалась для данной последовательности, возвращается ошибка.) Так как это значение ограничено рамками сеанса, эта функция выдаёт предсказуемый результат вне зависимости от того, вызвалась ли впоследствииnextval
в других сеансах или нет.lastval
Возвращает значение, выданное при последнем вызове
nextval
в текущем сеансе. Эта функция подобнаcurrval
, но она не принимает в параметрах имя последовательности, а выдаёт значение для той последовательности, для которойnextval
вызывалась в текущем сеансе в последний раз. Если в текущем сеансе функцияnextval
ещё не вызывалась, при вызовеlastval
произойдёт ошибка.setval
Сбрасывает счётчик последовательности. В форме с двумя параметрами устанавливает для последовательности заданное значение поля last_value и значение true для флага is_called, показывающего, что при следующем вызове
nextval
последовательность должна сначала продвинуться к очередному значению, которое будет возвращено. При этомcurrval
также возвратит заданное значение. В форме с тремя параметрами флагу is_called можно присвоить true или false. Со значением true она действует так же, как и форма с двумя параметрами. Если же присвоить этому флагу значение false, первый вызовnextval
после этого вернёт именно заданное значение, а продвижение последовательности произойдёт при последующем вызовеnextval
. Кроме того, значение, возвращаемоеcurrval
в этом случае, не меняется. Например,SELECT setval('foo', 42); Следующий вызов
nextval
вернёт 43 SELECT setval('foo', 42, true); То же самое SELECT setval('foo', 42, false); Следующий вызовnextval
вернёт 42Результатом самой функции
setval
будет просто значение её второго аргумента.Важно: Так как значения последовательностей изменяются вне транзакций, действие функции
setval
не отменяется при откате транзакции.
Пред. | Начало | След. |
Функции и операторы JSON | Уровень выше | Условные выражения |