Последовательности и генераторы
Последовательность (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.
Контрольные вопросы
- Чем последовательность отличается от генератора?
- Для каких целей чаще всего используют последовательности?
- Приведите пример оператора изменения последовательности?
- Назовите основные различия функции
GEN_IDи конструкцииNEXT VALUE FOR?