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);

Однако следующий запрос будет отклонён в базе данных YMatrix, так как он работает с распределёнными данными:

INSERT INTO product VALUES (setval('myserial', 201), 'gizmo');

В обычной (нераспределённой) базе данных функции, работающие с последовательностями, обращаются к локальному списку последовательностей, чтобы получить требуемое значение. Однако помните, что в базе данных YMatrix каждый сегмент представляет собой отдельный процесс базы данных. Поэтому для корректного увеличения значений на всех сегментах и правильного порядка продвижения последовательностей требуется единая точка доступа к значениям последовательностей. Процесс сервера последовательностей запускается на мастер-узле и является централизованной точкой для последовательностей в распределённой базе данных YMatrix. Сегменты получают значения последовательностей с мастер-узла во время выполнения.

Из-за такой архитектуры распределённых последовательностей существуют определённые ограничения на использование функций работы с последовательностями в базе данных YMatrix:

  • Функции lastval() и currval() не поддерживаются.
  • Функция setval() может использоваться только для установки значения генератора последовательности на мастер-узле и не может применяться в подзапросах для обновления записей в распределённых таблицах.
  • В зависимости от запроса nextval() иногда получает блок значений с мастер-узла для использования на сегменте. Поэтому, если не все значения из блока используются на уровне сегмента, некоторые значения последовательности могут пропускаться. Обратите внимание, что обычная база данных PostgreSQL может делать то же самое, поэтому данное поведение не является уникальным для YMatrix.

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

SELECT * FROM sequence_name;

чтобы проверить параметры и текущее состояние последовательности. В частности, поле last_value последовательности показывает последнее значение, присвоенное любой сессией.

Параметры

TEMPORARY | TEMP

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

name

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

INCREMENT

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

MINVALUE
NO MINVALUE

  • Определяет минимальное значение, которое может генерировать последовательность. Если этот параметр не указан или задано NO MINVALUE, используется значение по умолчанию. Для возрастающей и убывающей последовательностей значения по умолчанию равны 1 и -263-1 соответственно.

MAXVALUE
NO MAXVALUE

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

START

  • Указывает начальное значение последовательности. Значения по умолчанию: минимальное значение — для возрастающей последовательности, максимальное — для убывающей.

CACHE

  • Определяет количество предварительно выделенных номеров последовательности, которые хранятся в памяти для ускорения доступа. Минимальное (и по умолчанию) значение — 1 (кэширование отсутствует).

CYCLE
NO CYCLE

  • Разрешает зацикливание последовательности при достижении максимального (при возрастании) или минимального (при убывании) значения. При достижении предела следующее генерируемое число будет равно минимальному (для возрастающей) или максимальному (для убывающей). Если указано NO CYCLE, любая попытка вызвать nextval() после достижения предела вызовет ошибку. По умолчанию установлено NO CYCLE.

OWNED BY table.column
OWNED BY NONE

  • Связывает последовательность с определённым столбцом таблицы, чтобы при удалении столбца (или всей таблицы) последовательность также удалялась автоматически. Указанная таблица должна иметь того же владельца и находиться в той же схеме, что и последовательность. OWNED BY NONE (по умолчанию) означает, что связь отсутствует.

Примечание

Последовательности основаны на арифметике типа bigint, поэтому диапазон значений не может выходить за пределы 8-байтовых целых чисел (-9223372036854775808 до 9223372036854775807).

Хотя гарантируется, что разные сессии получат разные значения последовательности, порядок их генерации может не совпадать с фактическим порядком вызова nextval(). Например, сессия 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() в базе данных YMatrix (установка значений последовательности на распределённых данных):

INSERT INTO product VALUES (setval('myseq', 201), 'gizmo');

Совместимость

CREATE SEQUENCE соответствует стандарту SQL, за исключением следующих моментов:

  • Выражение AS data_type, определённое в стандарте SQL, не поддерживается.
  • Для получения следующего значения используется функция nextval(), а не выражение NEXT VALUE FOR, определённое в стандарте SQL.
  • Предложение OWNED BY является расширением базы данных YMatrix.

Смотрите также

ALTER SEQUENCE, DROP SEQUENCE