CREATE SEQUENCE — создание нового генератора последовательностей
CREATE [ { TEMPORARY | TEMP } | UNLOGGED ] SEQUENCE [ IF NOT EXISTS ] name
[ AS data_type ]
[ INCREMENT [ BY ] increment ]
[ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
[ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
[ OWNED BY { table_name.column_name | NONE } ]
CREATE SEQUENCE создает новый генератор последовательных чисел. Это включает в себя создание и инициализацию новой специальной однострочной таблицы с именем name. Владельцем генератора становится пользователь, выполнивший команду.
Если указано имя схемы, то последовательность создается в заданной схеме. В противном случае она создается в текущей схеме. Временные последовательности существуют в специальной схеме, поэтому при создании временной последовательности имя схемы указывать нельзя. Имя последовательности должно отличаться от имени любого другого отношения (таблицы, последовательности, индекса, представления, материализованного представления или сторонней таблицы) в той же схеме.
После того как последовательность создана, для управления ею используются функции
nextval,
currval, и
setval
to operate on the sequence. Эти функции описаны в
Раздел 2.6.17.
Хотя обновлять последовательность напрямую нельзя, можно использовать запрос вида:
SELECT * FROM имя;
для ознакомления с параметрами и текущим состоянием последовательности. В частности,
поле last_value последовательности содержит последнее значение, выделенное какой-либо сессией. (Разумеется, это значение может устареть
к моменту вывода, если в других сессиях активно выполняются
nextval вызовы.)
TEMPORARY или TEMPЕсли указано, объект последовательности создается только для текущей сессии и автоматически удаляется при ее завершении. Существующие постоянные последовательности с тем же именем не видны (в данной сессии), пока существует временная последовательность, если только к ним не обращаются по полному имени (с указанием схемы).
UNLOGGEDЕсли указано, создается нежурналируемая последовательность. Изменения в нежурналируемых последовательностях не записываются в журнал предзаписи (WAL). Они не обладают свойством отказоустойчивости: нежурналируемая последовательность автоматически сбрасывается в начальное состояние после сбоя или нештатного завершения работы. Нежурналируемые последовательности также не реплицируются на резервные серверы.
В отличие от нежурналируемых таблиц, нежурналируемые последовательности не обеспечивают значительного преимущества в производительности. Этот параметр в основном предназначен для последовательностей, связанных с нежурналируемыми таблицами через столбцы идентичности (identity) или серийные столбцы (serial). В таких случаях обычно не имеет смысла записывать данные последовательности в журнал предварительной записи (WAL) и реплицировать их, если связанная таблица не журналируется.
IF NOT EXISTSНе выдавать ошибку, если отношение с тем же именем уже существует. В этом случае выводится уведомление. Обратите внимание: нет никакой гарантии, что существующее отношение аналогично той последовательности, которая была бы создана — оно может даже не быть последовательностью.
nameИмя (необязательно со схемой) создаваемой последовательности.
data_type
Необязательное
предложение AS
задает тип данных последовательности. Допустимыми типами являются
data_typesmallint, integer,
и bigint. bigint является
значением по умолчанию. Тип данных определяет минимальное и максимальное значения последовательности по умолчанию.
increment
Необязательное предложение INCREMENT BY указывает,
какое значение прибавляется к текущему значению последовательности для получения
нового значения. Положительное значение создает возрастающую последовательность, отрицательное — убывающую последовательность. Значение по умолчанию — 1.
increment
minvalueNO MINVALUE
Необязательное предложение MINVALUE определяет
минимальное значение, которое может генерировать последовательность. Если это предложение не
указано или minvalueNO MINVALUE указано, то будут использованы значения по умолчанию. Для возрастающей последовательности значением по умолчанию является 1. Для убывающей последовательности значением по умолчанию является минимальное значение типа данных.
maxvalueNO MAXVALUE
Необязательное предложение MAXVALUE определяет
максимальное значение последовательности. Если это предложение не
указано или maxvalueNO MAXVALUE указано, то будут использоваться значения по умолчанию. Значением по умолчанию для возрастающей последовательности является максимальное значение соответствующего типа данных. Значением по умолчанию для убывающей последовательности является -1.
start
Необязательное предложение START WITH позволяет последовательности начинаться с любого значения. Начальным значением по умолчанию является
start minvalue для
возрастающих последовательностей и maxvalue для убывающих.
cache
Необязательное предложение CACHE определяет, какое количество значений последовательности должно быть предварительно выделено и сохранено в памяти для ускорения доступа. Минимальное значение равно 1 (одновременно может быть сгенерировано только одно значение, т. е. кэширование отсутствует); оно же является значением по умолчанию.
cache
CYCLENO CYCLE
Параметр CYCLE позволяет последовательности возобновляться по циклу при достижении maxvalue или minvalue в возрастающей или убывающей последовательности соответственно. При достижении предела следующим сгенерированным числом будет minvalue или maxvalueсоответственно.
Если NO CYCLE указано, любые вызовы
nextval после достижения последовательностью максимального значения будут возвращать ошибку. Если ни
CYCLE или NO CYCLE не
указаны, NO CYCLE используется по умолчанию.
OWNED BY table_name.column_nameOWNED 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 command:
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
expression.
Параметр OWNED BY предложение является расширением Digital Q.DataBase
extension.