CREATE SEQUENCE#

CREATE SEQUENCE

CREATE SEQUENCE

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 для работы с последовательностью. Эти функции описаны в Раздел 9.17.

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

SELECT * FROM name;

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

Параметры

TEMPORARY or TEMP

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

UNLOGGED

Если указано, последовательность создается как незарегистрированная последовательность. Изменения в незафиксированных последовательностях не записываются в журнал записи операций. Они не являются надежными при сбое: незарегистрированная последовательность автоматически сбрасывается в свое начальное состояние после сбоя или некорректного завершения работы. Незарегистрированные последовательности также не реплицируются на резервные серверы.

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

IF NOT EXISTS

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

name

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

data_type

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

increment

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

minvalue
NO MINVALUE

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

maxvalue
NO MAXVALUE

Опциональная фраза MAXVALUE maxvalue определяет максимальное значение для последовательности. Если эта фраза не указана или указана опция NO MAXVALUE, то будут использоваться значения по умолчанию. По умолчанию для возрастающей последовательности это максимальное значение типа данных. По умолчанию для убывающей последовательности это -1.

start

Необязательная фраза START WITH start позволяет начать последовательность с любого значения. Значение по умолчанию для начала последовательности - minvalue для возрастающих последовательностей и maxvalue для убывающих.

cache

Опциональное предложение CACHE cache определяет, сколько последовательных номеров будет предварительно выделено и сохранено в памяти для более быстрого доступа. Минимальное значение - 1 (может быть сгенерировано только одно значение за раз, то есть без кеша), и это также является значением по умолчанию.

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.

См. также

ALTER SEQUENCE, DROP SEQUENCE