CREATE SEQUENCE
Определяет новый генератор последовательностей.
Синтаксис
CREATE [TEMPORARY | TEMP] SEQUENCE <name>
[INCREMENT [BY] <value>]
[MINVALUE <minvalue> | NO MINVALUE]
[MAXVALUE <maxvalue> | NO MAXVALUE]
[START [ WITH ] <start>]
[CACHE <cache>]
[[NO] CYCLE]
[OWNED BY { <table>.<column> | NONE }]
Описание
CREATE SEQUENCE создает новый генератор последовательных чисел.
Его создание включает в себя создание и инициализацию новой специальной одностроковой таблицы.
Владельцем генератора становится пользователь, выполняющий эту команду.
Если указано имя схемы, последовательность создается в указанной схеме. В противном случае она создается в текущей схеме. Временные последовательности существуют в специальной схеме, поэтому при создании временной последовательности имя схемы указывать нельзя. Имя последовательности должно отличаться от имени любой другой последовательности, таблицы, индекса, представления или внешней таблицы в той же схеме.
После создания последовательности вы можете использовать функцию nextval() для работы с последовательностью.
Например, чтобы вставить строку в таблицу, получив следующее значение последовательности, выполните:
INSERT INTO distributors VALUES (nextval('myserial'), 'acme');
Также можно использовать функцию setval() для работы с последовательностью, но только для запросов, которые не работают с распределенными данными.
Например, следующий запрос допустим, потому что он сбрасывает значение счетчика последовательности для процесса генератора последовательности на мастере:
SELECT setval('myserial', 201);
Но следующий запрос будет отклонен в Greengage DB, потому что он работает с распределенными данными:
INSERT INTO product VALUES (setval('myserial', 201), 'gizmo');
В обычной (нераспределенной) базе данных функции, работающие с последовательностью, обращаются к локальной таблице последовательности, чтобы получать значения по мере необходимости. Однако учитывайте, что в Greengage DB каждый сегмент — это отдельный процесс базы данных. Следовательно, сегментам требуется единый источник истины для получения значений последовательности, чтобы все сегменты корректно увеличивали значения и последовательность продвигалась в правильном порядке. Процесс сервера последовательностей запускается на мастере и является источником истины для последовательности в распределенной базе Greengage DB. Сегменты получают значения последовательности во время выполнения от мастера.
Из-за распределенного устройства последовательностей существуют некоторые ограничения на функции, которые работают с последовательностью в Greengage DB:
-
Функции
lastval()иcurrval()не поддерживаются. -
setval()можно использовать только для установки значения генератора последовательности на мастере, ее нельзя использовать в подзапросах для обновления записей распределенных табличных данных. -
nextval()иногда захватывает блок значений на мастере для использования сегментом, в зависимости от запроса. -
Иногда в последовательности могут пропускаться значения, если в итоге сегменту не понадобился весь блок. Обратите внимание, что это свойственно и обычной базе данных PostgreSQL, так что такое поведение не является чем-то уникальным для Greengage DB.
Хотя вы не можете обновлять последовательность напрямую, вы можете использовать запрос вида:
SELECT * FROM <sequence_name>;
чтобы посмотреть параметры и текущее состояние последовательности.
В частности, поле last_value у последовательности показывает последнее значение, выделенное какой-либо сессией.
Параметры
| Параметр | Описание |
|---|---|
TEMPORARY | TEMP |
Если указано, объект последовательности создается только для этой сессии и автоматически удаляется при выходе из сессии. Существующие постоянные последовательности с тем же именем не видны (в этой сессии), пока существует временная последовательность, если только на них не ссылаются с помощью имен, квалифицированных схемой |
name |
Имя (при необходимости — с указанием схемы) создаваемой последовательности |
INCREMENT [BY] <value> |
Задает значение, которое прибавляется к текущему значению последовательности для получения нового значения.
Положительное значение создает возрастающую последовательность, отрицательное — убывающую.
Значение по умолчанию — |
MINVALUE <minvalue> | NO MINVALUE |
Определяет минимальное значение, которое может генерировать последовательность.
Если это выражение не указано или указано |
MAXVALUE <maxvalue> | NO MAXVALUE |
Определяет максимальное значение последовательности.
Если это выражение не указано или указано |
START [ WITH ] <start> |
Позволяет начинать последовательность с произвольного значения.
Начальное значение по умолчанию — |
CACHE <cache> |
Задает, сколько чисел последовательности будет заранее выделено и сохранено в памяти для ускорения доступа.
Минимальное (и значение по умолчанию) — |
[NO] CYCLE |
Разрешает последовательности зацикливаться, когда достигнуто значение |
OWNED BY { <table>.<column> | NONE } |
Связывает последовательность с определенным столбцом таблицы так, что при удалении этого столбца (или всей таблицы) последовательность также будет автоматически удалена.
Указанная таблица должна принадлежать тому же владельцу и находиться в той же схеме, что и последовательность.
|
Примечания
Последовательности основаны на типе bigint, поэтому диапазон не может превышать диапазон восьмибайтового целого числа (от -9223372036854775808 до 9223372036854775807).
Хотя нескольким сессиям гарантируется выделение различных значений последовательности, при рассмотрении всех сессий значения могут генерироваться не по порядку.
Например, сессия A может зарезервировать значения 1 — 10 и вернуть nextval=1, затем сессия B может зарезервировать значения 11 — 20 и вернуть nextval=11 до того, как сессия A сгенерирует nextval=2.
Таким образом, следует считать, что значения nextval() лишь уникальны, но не обязательно генерируются строго последовательно.
Кроме того, last_value будет отражать самое последнее значение, зарезервированное какой-либо сессией, независимо от того, было ли оно уже возвращено nextval().
Примеры
Создать последовательность с именем myseq:
CREATE SEQUENCE myseq START 101;
Вставить строку в таблицу, получив следующее значение последовательности с именем idseq:
INSERT INTO distributors VALUES (nextval('idseq'), 'acme');
Сбросить значение счетчика последовательности на мастере:
SELECT setval('myseq', 201);
Недопустимое использование setval() в Greengage DB (установка значений последовательности на распределенных данных):
INSERT INTO product VALUES (setval('myseq', 201), 'gizmo');
Совместимость
CREATE SEQUENCE соответствует стандарту SQL со следующими исключениями:
-
Выражение
AS data_type, указанное в стандарте SQL, не поддерживается. -
Получение следующего значения выполняется с помощью функции
nextval(), а не выраженияNEXT VALUE FOR, указанного в стандарте SQL. -
Выражение
OWNED BYявляется расширением Greengage DB.