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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Работа с последовательностями и генераторами

Основная функция для работы с последовательностями это NEXT VALUE FOR. Конструкция (функция) NEXT VALUE FOR позволяет получить значение указанного генератора, увеличенное на размер инкремента (по умолчанию на единицу).

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

NEXT VALUE FOR <имя генератора>

Точно такой же результат можно получить, вызвав функцию:

GEN_ID(<имя генератора>, <инкремент>)

Отличие в том, что при выполнении функции GEN_ID текущее значение указанного генератора, изменяется на указанную в качестве параметра величину приращения (это может быть положительное, отрицательное число или ноль). Обычно функция используется в операторах INSERT для получения уникальных числовых значений для искусственного первичного ключа. Вместо функции GEN_ID рекомендуется использовать конструкцию NEXT VALUE FOR.

Контрольные вопросы

  1. Чем последовательность отличается от генератора?
  2. Для каких целей чаще всего используют последовательности?
  3. Приведите пример оператора изменения последовательности?
  4. Назовите основные различия функции GEN_ID и конструкции NEXT VALUE FOR?