Последовательности и генераторы
Последовательность (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
).