CREATE SEQUENCE#
CREATE SEQUENCE
CREATE SEQUENCE — определить новый генератор последовательности
Синтаксис
CREATE [ { TEMPORARY | TEMP } | UNLOGGED ] SEQUENCE [ IF NOT EXISTS ]name
[ ASdata_type
] [ INCREMENT [ BY ]increment
] [ MINVALUEminvalue
| NO MINVALUE ] [ MAXVALUEmaxvalue
| NO MAXVALUE ] [ START [ WITH ]start
] [ CACHEcache
] [ [ NO ] CYCLE ] [ OWNED BY {table_name
.column_name
| NONE } ]
Описание
CREATE SEQUENCE
создает новый генератор последовательных номеров. Это включает в себя создание и инициализацию новой специальной таблицы с одной строкой с именем name
. Генератор будет принадлежать пользователю, выполнившему команду.
Если указано имя схемы, то последовательность создается в указанной схеме. В противном случае она создается в текущей схеме. Временные последовательности существуют в специальной схеме, поэтому при создании временной последовательности нельзя указывать имя схемы. Имя последовательности должно отличаться от имени любого другого отношения (таблицы, последовательности, индекса, представления, материализованного представления или внешней таблицы) в той же схеме.
После создания последовательности вы используете функции
nextval
,
currval
и
setval
для работы с последовательностью. Эти функции описаны в
Раздел 9.17.
Хотя вы не можете обновить последовательность напрямую, вы можете использовать запрос вроде:
SELECT * FROM name
;
для изучения параметров и текущего состояния последовательности. В частности, поле last_value
последовательности показывает последнее значение, выделенное любой сессией. (Конечно, это значение может быть устаревшим к моменту его печати, если другие сессии активно вызывают функцию nextval
).
Параметры
TEMPORARY
orTEMP
Если указано, объект последовательности создается только для этой сессии и автоматически удаляется при завершении сессии. Существующие постоянные последовательности с тем же именем не видны (в этой сессии), пока существует временная последовательность, если только они не ссылается с указанием схемы.
UNLOGGED
Если указано, последовательность создается как незарегистрированная последовательность. Изменения в незафиксированных последовательностях не записываются в журнал записи операций. Они не являются надежными при сбое: незарегистрированная последовательность автоматически сбрасывается в свое начальное состояние после сбоя или некорректного завершения работы. Незарегистрированные последовательности также не реплицируются на резервные серверы.
В отличие от незафиксированных таблиц, незарегистрированные последовательности не предлагают значительного преимущества в производительности. Эта опция предназначена в основном для последовательностей, связанных с незарегистрированными таблицами через столбцы идентификаторов или серийных столбцов. В таких случаях обычно не имеет смысла регистрировать и тиражировать последовательность, но не связанную с ней таблицу.
IF NOT EXISTS
Не генерировать ошибку, если уже существует отношение с таким же именем. В этом случае будет выдано уведомление. Обратите внимание, что не гарантируется, что существующее отношение будет похоже на последовательность, которая была бы создана — оно может даже не быть последовательностью.
name
Имя (опционально с указанием схемы) создаваемой последовательности.
data_type
Необязательная фраза
AS
указывает тип данных последовательности. Допустимые типы данных:data_type
smallint
,integer
, иbigint
. По умолчанию используется тип данныхbigint
. Тип данных определяет минимальное и максимальное значения последовательности по умолчанию.increment
Необязательная фраза
INCREMENT BY
указывает, какое значение добавляется к текущему значению последовательности для создания нового значения. Положительное значение создаст возрастающую последовательность, отрицательное - убывающую. Значение по умолчанию - 1.increment
minvalue
NO MINVALUE
Необязательная фраза
MINVALUE
определяет минимальное значение, которое может генерировать последовательность. Если эта фраза не указана или указана опцияminvalue
NO MINVALUE
, то будут использоваться значения по умолчанию. Значение по умолчанию для возрастающей последовательности - 1. Значение по умолчанию для убывающей последовательности - минимальное значение типа данных.maxvalue
NO MAXVALUE
Опциональная фраза
MAXVALUE
определяет максимальное значение для последовательности. Если эта фраза не указана или указана опцияmaxvalue
NO MAXVALUE
, то будут использоваться значения по умолчанию. По умолчанию для возрастающей последовательности это максимальное значение типа данных. По умолчанию для убывающей последовательности это -1.start
Необязательная фраза
START WITH
позволяет начать последовательность с любого значения. Значение по умолчанию для начала последовательности -start
minvalue
для возрастающих последовательностей иmaxvalue
для убывающих.cache
Опциональное предложение
CACHE
определяет, сколько последовательных номеров будет предварительно выделено и сохранено в памяти для более быстрого доступа. Минимальное значение - 1 (может быть сгенерировано только одно значение за раз, то есть без кеша), и это также является значением по умолчанию.cache
CYCLE
NO CYCLE
Опция
CYCLE
позволяет последовательности обернуться, когда значениеmaxvalue
илиminvalue
было достигнуто в возрастающей или убывающей последовательности соответственно. Если достигнут предел, следующее сгенерированное число будетminvalue
илиmaxvalue
соответственно.Если указано
NO CYCLE
, то любые вызовы функцииnextval
после достижения последовательностью своего максимального значения будут возвращать ошибку. Если не указаны ниCYCLE
, ниNO CYCLE
, то по умолчанию используетсяNO CYCLE
.OWNED BY
table_name
.column_name
OWNED BY NONE
Опция
OWNED BY
приводит к тому, что последовательность связывается с определенным столбцом таблицы, так что если этот столбец (или вся таблица) будет удален, последовательность также будет автоматически удалена. Указанная таблица должна иметь того же владельца и находиться в той же схеме, что и последовательность.OWNED BY NONE
, значение по умолчанию, указывает, что такой связи нет.
Примечания
Используйте DROP SEQUENCE
для удаления последовательности.
Все последовательности основаны на арифметике bigint
, поэтому диапазон не может превышать диапазон восьмибайтового целого числа (-9223372036854775808 до 9223372036854775807).
Поскольку вызовы функций nextval
и setval
никогда не откатываются, объекты последовательностей не могут быть использованы, если требуется “безразрывное” присвоение последовательных номеров. Возможно создание безразрывного присвоения путем исключающей блокировки таблицы, содержащей счетчик, но такое решение гораздо более затратное, чем использование объектов последовательностей, особенно если множество транзакций одновременно требуют последовательных номеров.
Неожиданные результаты могут быть получены, если для объекта последовательности, который будет использоваться одновременно несколькими сессиями, установлен параметр cache
больше единицы. Каждая сессия будет выделять и кешировать последовательные значения последовательности во время доступа к объекту последовательности и соответственно увеличивать значение last_value
объекта последовательности. Затем, следующие cache
-1 использований функции nextval
в этой сессии просто возвращают предварительно выделенные значения, не затрагивая объект последовательности. Таким образом, любые числа, выделенные, но не использованные в рамках сессии, будут потеряны при завершении этой сессии, что приведет к “пропускам” в последовательности.
Кроме того, хотя гарантируется, что в разных сессиях будут выделены разные значения последовательности, значения могут быть сгенерированы не последовательно, если учесть все сессии. Например, при установке параметра cache
равным 10, сессия A может зарезервировать значения 1..10 и вернуть nextval
=1, затем сессия B может зарезервировать значения 11..20 и вернуть nextval
=11 до того, как сессия A сгенерирует nextval
=2. Таким образом, при установке параметра cache
равным одному можно считать, что значения nextval
генерируются последовательно; при установке параметра cache
больше единицы следует предполагать только то, что значения nextval
все разные, а не что они генерируются строго последовательно. Кроме того, last_value
будет отражать последнее зарезервированное значение любой сессией, независимо от того, было ли оно уже возвращено nextval
.
Важно также учесть, что выполнение функции setval
на такой последовательности не будет замечено другими сессиями до тех пор, пока они не израсходуют все предварительно выделенные значения, которые они кешировали.
Примеры
Создайте возрастающую последовательность с именем serial
, начиная с 101:
CREATE SEQUENCE serial START 101;
Выберите следующий номер из этой последовательности:
SELECT nextval('serial'); nextval --------- 101
Выберите следующий номер из этой последовательности:
SELECT nextval('serial'); nextval --------- 102
Используйте эту последовательность в команде INSERT
:
INSERT INTO distributors VALUES (nextval('serial'), 'nothing');
Обновите значение последовательности после команды COPY FROM
:
BEGIN; COPY distributors FROM 'input_file'; SELECT setval('serial', max(id)) FROM distributors; END;
Совместимость
CREATE SEQUENCE
соответствует стандарту SQL,
за исключением следующих особенностей:
Получение следующего значения выполняется с использованием функции
nextval()
вместо стандартного выраженияNEXT VALUE FOR
.Предложение
OWNED BY
является расширением Tantor BE.