Последовательность (sequence) или генератор (generator) — объект базы данных, предназначенный для получения уникального числового значения. Термин последовательность является SQL совместимым. Ранее в Interbase и Firebird последовательности называли генераторами.
Независимо от диалекта базы данных последовательности (или генераторы) всегда хранятся как 64-битные целые значения.
Caution
|
Если клиент использует 1 диалект, то сервер передаёт ему значения последовательности, усечённые до 32-битного значения. Если значение последовательности передаются в 32-разрядное поле или переменную, то до тех пор, пока текущее значение последовательности не вышло за границы для 32-битного числа, ошибок не будет. В момент выхода значения последовательности за этот диапазон база данных 3-го диалекта выдаст сообщение об ошибке, а база данных 1-ого диалекта будет молча обрезать значения, что также может привести к ошибке — например, если поле, заполняемое генератором, является первичным или уникальным. |
В данном разделе описываются вопросы создания, модификации (установка значения последовательности) и удаления последовательностей.
Создание новой последовательности (генератора).
DSQL, ESQL
CREATE {SEQUENCE | GENERATOR} seq_name [START WITH start_value] [INCREMENT [BY] increment]
CREATE SEQUENCE
Параметр | Описание |
---|---|
seq_name |
Имя последовательности (генератора). Может содержать до 63 символов. |
start_value |
Начальное значение последовательности (генератора).
По умолчанию равно |
increment |
Шаг приращения.
4 байтовое целое число.
По умолчанию равно |
Оператор CREATE SEQUENCE
создаёт новую последовательность.
Слова SEQUENCE
и GENERATOR
являются синонимами.
Вы можете использовать любое из них, но рекомендуется использовать SEQUENCE
.
В момент создания последовательности ей устанавливается значение, указанное в необязательном предложении START WITH
минус значение приращения указанное в предложении INCREMENT [BY]
.
Если предложение STARTING WITH
отсутствует, то последовательности устанавливается значение равное 1.
Таким образом, если начальное значение последовательности равно 100, а приращение 10, то первое значение выданное оператором NEXT VALUE FOR
будет равно 100.
Note
|
До Firebird 4.0, первое значение выданное оператором |
Необязательное предложение INCREMENT [BY]
позволяет задать шаг приращения для оператора NEXT VALUES FOR
.
По умолчанию шаг приращения равен единице.
Приращение не может быть установлено в ноль для пользовательских последовательностей.
Значение последовательности изменяется также при обращении к функции GEN_ID
, где в качестве параметра указывается имя последовательности и значение приращения, которое может быть отлично от указанного в предложении INCREMENT BY
.
Выполнить оператор CREATE SEQUENCE
(CREATE GENERATOR
) могут:
-
Пользователи с привилегией
CREATE SEQUENCE
(CREATE GENERATOR
).
Пользователь, создавший последовательность, становится её владельцем.
Создание последовательности EMP_NO_GEN с начальным значением 0 и шагом приращения равным единице.
CREATE SEQUENCE EMP_NO_GEN;
Создание последовательности EMP_NO_GEN с начальным значением 5 и шагом приращения равным единице.
CREATE SEQUENCE EMP_NO_GEN START WITH 5;
Создание последовательности EMP_NO_GEN с начальным значением 1 и шагом приращения равным 10.
CREATE SEQUENCE EMP_NO_GEN INCREMENT BY 10;
Создание последовательности EMP_NO_GEN с начальным значением 5 и шагом приращения равным 10.
CREATE SEQUENCE EMP_NO_GEN START WITH 5 INCREMENT BY 10;
ALTER SEQUENCE, SET GENERATOR, DROP SEQUENCE, NEXT VALUE FOR, GEN_ID.
Изменение последовательности (генератора).
DSQL, ESQL
ALTER {SEQUENCE | GENERATOR} seq_name [RESTART [WITH newvalue]] [INCREMENT [BY] increment]
ALTER SEQUENCE
Параметр | Описание |
---|---|
seq_name |
Имя последовательности (генератора). |
newvalue |
Новое значение последовательности (генератора). 64 битное целое в диапазоне от -263 до 263 - 1 |
increment |
Шаг приращения. Не может быть равным |
Оператор ALTER SEQUENCE
устанавливает значение последовательности или генератора в заданное значение и/или изменяет значение приращения.
Предложение RESTART WITH
позволяет установить значение последовательности.
Предложение RESTART
может быть использовано самостоятельно (без WITH
) для перезапуска значения последовательности с того значения с которого был начат старт генерации значений или предыдущий рестарт.
Warning
|
Неосторожное использование оператора |
Предложение INCREMENT [BY]
позволяет изменить шаг приращения последовательности для оператора NEXT VALUES FOR
.
Note
|
Изменение значения приращения — это возможность, которая вступает в силу для каждого запроса, который запускается после фиксаций изменения.
Процедуры, которые вызваны впервые после изменения приращения, будут использовать новое значение, если они будут содержать операторы |
Выполнить оператор ALTER SEQUENCE
(ALTER GENERATOR
) могут:
-
Владелец последовательности (генератора);
-
Пользователи с привилегией
ALTER ANY SEQUENCE
(ALTER ANY GENERATOR
).
Установка для последовательности EMP_NO_GEN значения 145.
ALTER SEQUENCE EMP_NO_GEN RESTART WITH 145;
Сброс значения последовательности в то, которое было установлено при создании последовательности (или при предыдущей установке значения).
ALTER SEQUENCE EMP_NO_GEN RESTART;
Изменение значения приращения последовательности EMP_NO_GEN.
ALTER SEQUENCE EMP_NO_GEN INCREMENT BY 10;
SET GENERATOR, CREATE SEQUENCE, DROP SEQUENCE, NEXT VALUE FOR, GEN_ID.
Создание новой или изменение существующей последовательности (генератора).
DSQL, ESQL
CREATE OR ALTER {SEQUENCE | GENERATOR} seq_name [{START WITH start_value | RESTART}] [INCREMENT [BY] increment]
CREATE OR ALTER SEQUENCE
Параметр | Описание |
---|---|
seq_name |
Имя последовательности (генератора). Может содержать до 63 символов. |
start_value |
Начальное значение последовательности (генератора).
По умолчанию равно |
increment |
Шаг приращения.
4 байтное целое число.
По умолчанию равно |
Если последовательности не существует, то она будет создана. Уже существующая последовательность будет изменена, при этом существующие зависимости последовательности будут сохранены.
Important
|
Оператор CREATE OR ALTER SEQUENCE требует, чтобы хотя бы одно из необязательных предложений было указано. |
CREATE OR ALTER SEQUENCE EMP_NO_GEN
START WITH 10
INCREMENT BY 1;
Удаление последовательности (генератора).
DSQL, ESQL
DROP {SEQUENCE | GENERATOR} seq_name
DROP SEQUENCE
Параметр | Описание |
---|---|
seq_name |
Имя последовательности (генератора). |
Оператор DROP SEQUENCE
удаляет существующую последовательность (генератор). Слова SEQUENCE
и GENERATOR
являются синонимами.
Вы можете использовать любое из них, но рекомендуется использовать SEQUENCE
.
При наличии зависимостей для существующей последовательности (генератора) удаления не будет выполнено.
Выполнить оператор DROP SEQUENCE
(DROP GENERATOR
) могут:
-
Владелец последовательности (генератора);
-
Пользователи с привилегией
DROP ANY SEQUENCE
(DROP ANY GENERATOR
).
DROP SEQUENCE EMP_NO_GEN;
Создание или пересоздание последовательности (генератора).
DSQL, ESQL
RECREATE {SEQUENCE | GENERATOR} seq_name [START WITH start_value] [INCREMENT [BY] increment];
RECREATE SEQUENCE
Параметр | Описание |
---|---|
seq_name |
Имя последовательности (генератора). Может содержать до 63 символов. |
start_value |
Начальное значение последовательности (генератора). |
increment |
Шаг приращения. 4 байтное целое число. |
Оператор RECREATE SEQUENCE
создаёт или пересоздаёт последовательность (генератор). Если последовательность с таким именем уже существует,
то оператор RECREATE SEQUENCE
попытается удалить её и создать новую последовательность.
При наличии зависимостей для существующей последовательности оператор RECREATE SEQUENCE
не выполнится.
Устанавливает значение последовательности или генератора в заданное значение.
DSQL, ESQL
SET GENERATOR seq_name TO new_val
SET GENERATOR
Параметр | Описание |
---|---|
seq_name |
Имя последовательности (генератора). |
new_val |
Новое значение последовательности (генератора). 64 битное целое в диапазоне от -263 .. 263 - 1 |
Оператор SET GENERATOR
устанавливает значение последовательности или генератора в заданное значение.
Note
|
Оператор Неосторожное использование оператора |
Выполнить оператор SET GENERATOR
могут:
-
Владелец последовательности (генератора);
-
Пользователи с привилегией
ALTER ANY SEQUENCE
(ALTER ANY GENERATOR
).
SET GENERATOR EMP_NO_GEN TO 145;
Note
|
То же самое можно сделать, используя оператор ALTER SEQUENCE ALTER SEQUENCE EMP_NO_GEN RESTART WITH 145; |