Последовательности и генераторы

Последовательность (sequence) или генератор (generator) — это самый простой объект базы данных. Он позволяет хранить и генерировать 8 байтные целые числа в диапазоне значений: от −2^63 до2^63 - 1. Обычно используются для формирования значений искусственных первичных ключей.

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

Исторически в Interbase/Firebird/RedDatabase были генераторы. Позднее, когда последовательности вошли в стандарт SQL грамматика языка была доработана, но внутри СУБД используются теже генераторы. Таким образом, это синонимы, а все функции и операторы языка SQL могут применятся как к последовательностям, так и к генераторам. При дальнейшем изложении будем стараться использовать термин последовательность, т.к. он больше соответствует стандарту языка SQL.

Создание последовательности

Синтаксис оператора создания последовательности:

CREATE {GENERATOR | SEQUENCE} <имя последовательности>
    [START WITH <начальное значение>] [INCREMENT [BY] <приращение>];

Ключевые слова GENERATOR и SEQUENCE являются синонимами.

Имя последовательности должно быть уникальным среди имен всех генераторов базы данных и должно содержать до 31 символа.

В момент создания последовательности ей устанавливается значение, указанное в необязательном предложении START WITH или 0.

Необязательное предложение INCREMENT [BY] позволяет задать шаг приращения для оператора NEXT VALUE FOR. По умолчанию шаг приращения равен единице.

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

Создавать последовательности могут администраторы и те пользователи, у кого есть привилегия CREATE SEQUENCE (CREATE GENERATOR). Пользователь, создавший последовательность, становится её владельцем.

Изменение последовательности

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

ALTER SEQUENCE
    ALTER SEQUENCE <имя генератора> RESTART WITH <значение>
    [RESTART [WITH <значение>]]
    [INCREMENT [BY] <приращение>]

Устаревший синтаксис для генераторов также доступен и будет работать для этих объектов.

SET GENERATOR <имя генератора> TO <значение>

Предложение RESTART WITH позволяет установить значение последовательности.

Предложение RESTART может быть использовано самостоятельно (без WITH) для перезапуска значения последовательности с того значения, с которого был начат старт генерации значений или предыдущий рестарт.

Предложение INCREMENT [BY] позволяет изменить шаг приращения последовательности для оператора NEXT VALUE FOR.

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

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

Операторы ALTER SEQUENCE (ALTER GENERATOR) и SET GENERATOR могут выполнять владельцы последовательностей, администраторы и пользователи с привилегией ALTER ANY SEQUENCE (ALTER ANY GENERATOR).

С помощью оператора CREATE OR ALTER GENERATOR (SEQUENCE) можно создать новую или изменить существующую последовательность:

CREATE OR ALTER {GENERATOR | SEQUENCE} <имя последовательности>
    [{START WITH <начальное значение> | RESTART}]
    [INCREMENT [BY] <приращение>]

Если последовательности не существует, то она будет создана. Уже существующая последовательность будет изменена, при этом существующие зависимости последовательности будут сохранены.

Удаление последовательности

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

DROP {GENERATOR | SEQUENCE) <имя генератора>

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

Удалять генераторы могут администраторы, владельцы последовательности и пользователи с привилегией DROP ANY SEQUENCE (DROP ANY GENERATOR).