CREATE SEQUENCE
CREATE SEQUENCE — создать генератор последовательности
Синтаксис
CREATE [ TEMPORARY | TEMP ] SEQUENCE [ IF NOT EXISTS ]имя
[ INCREMENT [ BY ]шаг
] [ MINVALUEмин_значение
| NO MINVALUE ] [ MAXVALUEмакс_значение
| NO MAXVALUE ] [ START [ WITH ]начало
] [ CACHEкеш
] [ [ NO ] CYCLE ] [ OWNED BY {имя_таблицы
.имя_столбца
| NONE } ]
Описание
CREATE SEQUENCE
создаёт генератор последовательности. Эта операция включает создание и инициализацию специальной таблицы имя
, содержащей одну строку. Владельцем генератора будет пользователь, выполняющий эту команду.
Если указано имя схемы, последовательность создаётся в заданной схеме, в противном случае — в текущей. Временные последовательности существуют в специальной схеме, так что при создании таких последовательностей имя схемы задать нельзя. Имя последовательности должно отличаться от имён других последовательностей, таблиц, индексов, представлений или сторонних таблиц, уже существующих в этой схеме.
После создания последовательности работать с ней можно, вызывая функции nextval
, currval
и setval
. Эти функции документированы в Разделе 9.16.
Хотя непосредственно изменить значение последовательности нельзя, получить её параметры и текущее состояние можно таким запросом:
SELECT * FROM name
;
В частности, поле last_value
последовательности будет содержать последнее значение, выделенное для какого-либо сеанса. (Конечно, ко времени вывода это значение может стать неактуальным, если другие сеансы активно вызывают nextval
.)
Параметры
TEMPORARY
илиTEMP
Если указано, объект последовательности создаётся только для данного сеанса и автоматически удаляется при завершении сеанса. Существующая постоянная последовательность с тем же именем не будут видна (в этом сеансе), пока существует временная, однако к ней можно обратиться, дополнив имя указанием схемы.
IF NOT EXISTS
Не считать ошибкой, если отношение с таким именем уже существует. В этом случае будет выдано замечание. Заметьте, что нет никакой гарантии, что существующее отношение как-то соотносится с последовательностью, которая могла бы быть создана — это может быть даже не последовательность.
имя
Имя создаваемой последовательности (возможно, дополненное схемой).
шаг
Необязательное предложение
INCREMENT BY
определяет, какое число будет добавляться к текущему значению последовательности для получения нового значения. С положительным шагом последовательность будет возрастающей, а с отрицательным — убывающей. Значение по умолчанию: 1.шаг
мин_значение
NO MINVALUE
Необязательное предложение
MINVALUE
определяет наименьшее число, которое будет генерировать последовательность. Если это предложение опущено, либо указаномин_значение
NO MINVALUE
, используется значение по умолчанию: 1 и -263-1 для возрастающих и убывающих последовательностей, соответственно.макс_значение
NO MAXVALUE
Необязательное предложение
MAXVALUE
определяет наибольшее значение. Если это предложение опущено, либо указаномакс_значение
NO MAXVALUE
, используется значение по умолчанию: 263-1 и -1 для возрастающих и убывающих последовательностей, соответственно.начало
Необязательное предложение
START WITH
позволяет запустить последовательность с любого значения. По умолчанию началом считаетсяначало
мин_значение
для возрастающих последовательностей имакс_значение
для убывающих.кеш
Необязательное предложение
CACHE
определяет, сколько чисел последовательности будет выделяться и сохраняться в памяти для ускорения доступа к ним. Минимальное значение равно 1 (за один раз генерируется только одно значение, т. е. кеширования нет), и оно же предполагается по умолчанию.кеш
CYCLE
NO CYCLE
Параметр
CYCLE
позволяет зациклить последовательность при достижениимакс_значения
илимин_значения
для возрастающей или убывающей последовательности, соответственно. Когда этот предел достигается, следующим числом этих последовательностей будет соответственномин_значение
илимакс_значение
.Если указывается
NO CYCLE
, при каждом вызовеnextval
после достижения предельного значения будет возникать ошибка. Если указанияCYCLE
иNO CYCLE
отсутствуют, по умолчанию предполагаетсяNO CYCLE
.OWNED BY
имя_таблицы
.имя_столбца
OWNED BY NONE
Предложение
OWNED BY
позволяет связать последовательность с определённым столбцом таблицы так, чтобы при удалении этого столбца (или всей таблицы) последовательность удалялась автоматически. Указанная таблица должна иметь того же владельца и находиться в той же схеме, что и последовательность. Подразумеваемое по умолчанию предложениеOWNED BY NONE
указывает, что такая связь не устанавливается.
Замечания
Для удаления последовательности применяется команда DROP SEQUENCE
.
Последовательности основаны на арифметике bigint
, так что их значения не могут выходить за диапазон восьмибайтовых целых (-9223372036854775808 .. 9223372036854775807).
Так как вызовы nextval
и setval
никогда не откатываются, объекты последовательностей не подходят, если требуется обеспечить непрерывное назначение номеров последовательностей. Непрерывное назначение можно организовать, используя исключительную блокировку таблицы со счётчиком; однако это решение будет гораздо дороже, чем применение объектов последовательностей, особенно когда последовательные номера будут затребоваться сразу многими транзакциями.
Если значение параметра кеш
больше единицы, и объект последовательности используется параллельно в нескольких сеансах, результат может оказаться не вполне ожидаемым. Каждый сеанс будет выделять и кешировать несколько очередных значений последовательности при одном обращении к объекту последовательности и соответственно увеличивать последнее_значение
этого объекта. Затем при следующих кеш
-1 вызовах nextval
в этом сеансе будет просто возвращать заготовленные значения, не касаясь объекта последовательности. В результате, все числа, выделенные, но не использованные в сеансе, будут потеряны при завершении сеанса, что приведёт к образовании «дырок» в последовательности.
Более того, хотя разным сеансам гарантированно выделяются различные значения последовательности, если рассмотреть все сеансы в целом, порядок этих значений может быть нарушен. Например, при значении кеш
, равном 10, сеанс A может зарезервировать значения 1..10 и получить nextval
=1, затем сеанс B может зарезервировать значения 11..20 и получить nextval
=11 до того, как в сеансе A сгенерируется nextval
=2. Таким образом, при значении кеш
, равном одному, можно быть уверенными в том, что nextval
генерирует последовательные значения; но если кеш
больше одного, рассчитывать можно только на то, что все значения 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, со следующими исключениями:
Описанное в стандарте выражение
AS <тип данных>
не поддерживается.Для получения следующего значения применяется функция
nextval()
, а не выражениеNEXT VALUE FOR
, как того требует стандарт.Предложение
OWNED BY
является расширением Postgres Pro.