Привет, Я DocuDroid!
Оценка ИИ поиска
Спасибо за оценку нашего ИИ поиска!
Мы будем признательны, если вы поделитесь своими впечатлениями, чтобы мы могли улучшить наш ИИ поиск для вас и других читателей.
GitHub

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>

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

MINVALUE <minvalue> | NO MINVALUE

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

MAXVALUE <maxvalue> | NO MAXVALUE

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

START [ WITH ] <start>

Позволяет начинать последовательность с произвольного значения. Начальное значение по умолчанию — minvalue для возрастающих последовательностей и maxvalue для убывающих

CACHE <cache>

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

[NO] CYCLE

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

OWNED BY { <table>.<column> | NONE }

Связывает последовательность с определенным столбцом таблицы так, что при удалении этого столбца (или всей таблицы) последовательность также будет автоматически удалена. Указанная таблица должна принадлежать тому же владельцу и находиться в той же схеме, что и последовательность. OWNED BY 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.

См. также