CREATE SEQUENCE

CREATE SEQUENCE — определить новый генератор последовательности

Синтаксис

CREATE [ TEMPORARY | TEMP ] SEQUENCE [ IF NOT EXISTS ] имя
    [ AS тип_данных ]
    [ INCREMENT [ BY ] шаг ]
    [ MINVALUE мин_значение | NO MINVALUE ] [ MAXVALUE макс_значение | NO MAXVALUE ]
    [ START [ WITH ] начало ] [ CACHE кэш ] [ [ NO ] CYCLE ]
    [ OWNED BY { имя_таблицы.имя_столбца | NONE } ]

Описание

Команда CREATE SEQUENCE создает новый генератор порядковых номеров. Это включает в себя создание и инициализацию новой специальной однострочной таблицы с именем имя. Генератор будет принадлежать пользователю, выдавшему команду.

Если задано имя схемы, то последовательность создается в указанной схеме, в противном случае — в текущей. Временные последовательности существуют в специальной схеме, поэтому при создании временной последовательности имя схемы не может быть задано. Имя последовательности должно отличаться от имени любой другой последовательности, таблицы, индекса, представления или сторонней таблицы в той же схеме.

После того как последовательность создана, с ней можно работать, используя функции nextval, currval и setval. Эти функции описаны в разделе Функции управления последовательностями.

Хотя обновить последовательность напрямую нельзя, можно использовать запрос наподобие этого:

SELECT * FROM name;

чтобы изучить ее параметры и текущее состояние. В частности, поле last_value последовательности показывает последнее значение, выделенное для какого-либо сеанса. (Разумеется, если другие сеансы активно вызывают nextval, то к моменту печати это значение может устареть.)

Параметры

TEMPORARY или TEMP

Если этот параметр указан, объект последовательности создается только для этого сеанса и автоматически удаляется при выходе из сеанса. Существующие постоянные последовательности с одинаковым именем не видны (в этом сеансе), пока существует временная последовательность, если только они не связаны с именами, определенными схемой.

IF NOT EXISTS

Не считать ошибкой, если связь с тем же именем уже существует. В этом случае будет выдано соответствующее уведомление. Обратите внимание, что нет никакой гарантии, что существующее отношение как-то соотносится с последовательностью, которая была бы создана — это может даже не быть последовательностью.

имя

Имя создаваемой последовательности (может быть дополнено схемой).

тип_данных

Необязательное предложение AS тип_данных задает тип данных последовательности. Допустимые типы: smallint, integer и bigint. Значение по умолчанию равно bigint. Тип данных определяет минимальные и максимальные значения последовательности по умолчанию.

шаг

Необязательное предложение INCREMENT BY шаг указывает, какое значение добавляется к текущему значению последовательности для создания нового значения. Положительное значение сделает восходящую последовательность, отрицательное — нисходящую. Значение по умолчанию равно 1.

мин_значение NO MINVALUE

Необязательное предложение MINVALUE мин_значение определяет минимальное значение, которое может генерировать последовательность. Если это условие не указано или не указано значение NO MINVALUE, будут использоваться значения по умолчанию. Значение по умолчанию для восходящей последовательности равно 1. Значение по умолчанию для нисходящей последовательности равно минимальному значению типа данных.

макс_значение NO MAXVALUE

Необязательное предложение MAXVALUE макс_значение определяет максимальное значение для последовательности. Если это условие не указано или указано значение NO MAXVALUE, будут использоваться значения по умолчанию. Значение по умолчанию для восходящей последовательности равно максимальному значению типа данных. Значение по умолчанию для нисходящей последовательности равно -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 до того, как сеанс А сгенерирует nextval=2. Таким образом, при значении кэш, равном единице, можно с уверенностью предположить, что значения nextval генерируются последовательно, но при значении кэш выше единицы следует предполагать лишь, что все значения nextval различны, а не исключительную последовательность их генерации. Кроме того, последнее_значение будет отражать самое последнее значение, зарезервированное любым сеансом, независимо от того, было ли оно уже возвращено 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 является расширением QHB.

См. также

ALTER SEQUENCE, DROP SEQUENCE