Документация Firebird → Документация по Firebird → Генераторы в Firebird → Операторы SQL для генераторов |
Имя генератора должно являться обычным идентификатором метаданных базы данных: максимум 31 символ, без специальных символов за исключением символа подчеркивания «_» (если вы не используете регистрозависимые идентификаторы в кавычках). Команды и операторы SQL, применяемые к генераторам, перечислены ниже. Их использование более подробно будет описано в разделе Использование операторов для генераторов.
Операторы DDL (Data Definition Language - язык определения данных):
CREATE GENERATOR <name>; SET GENERATOR <name> TO <value>; DROP GENERATOR <name>;
Операторы DML (Data Manipulation Language - язык манипуляции данными) в клиентском SQL:
SELECT GEN_ID(<GeneratorName>, <increment>) FROM RDB$DATABASE;
Операторы DML в PSQL (Procedural SQL - процедурный SQL - расширение языка, используемое в хранимых процедурах и триггерах):
<intvar> = GEN_ID(<GeneratorName>, <increment>);
Хотя в СУБД Firebird 2 все еще полностью поддерживается традиционный синтаксис, существует рекомендуемый DDL-эквивалент для СУБД Firebird 2:
CREATE SEQUENCE <name>; ALTER SEQUENCE <name> RESTART WITH <value>; DROP SEQUENCE <name>;
А для операторов DML:
SELECT NEXT VALUE FOR <SequenceName> FROM RDB$DATABASE;
<intvar> = NEXT VALUE FOR <SequenceName>;
В настоящее время рекомендуемый синтаксис не поддерживает шаг изменения (инкремент), отличный от 1. Это ограничение будет снято в будущих версиях. Пока используйте GEN_ID, если вы хотите использовать другое значение для шага изменения значения.
Доступность операторов и функций зависит от того, где вы их используете:
Клиентский SQL – используемый вами язык, когда вы, в качестве клиента, общаетесь с сервером СУБД Firebird.
PSQL – язык программирования на стороне сервера, используемый в хранимых процедурах и триггерах СУБД Firebird.
CREATE GENERATOR <GeneratorName>;
Предпочтительно для СУБД Firebird 2 и старше:
CREATE SEQUENCE <SequenceName>;
Невозможно. Так как вы не можете изменять метаданные базы данных в хранимых процедурах (stored procedures) или триггерах, вы не можете создавать генераторы.
В СУБД Firebird 1.5 и старше вы можете обходить это ограничение с помощью оператора EXECUTE STATEMENT.
SELECT GEN_ID(<GeneratorName>, 0) FROM RDB$DATABASE;
Этот синтаксис является единственной возможностью получить текущее значение генератора в СУБД Firebird 2.
В утилите для СУБД Firebird isql есть две дополнительные команды для получения текущего значения генератора:
SHOW GENERATOR <GeneratorName>; SHOW GENERATORS;
Первая показывает текущее значение конкретного генератора. Вторая команда делает то же самое для всех не системных генераторов базы данных.
Предпочтительный для СУБД Firebird 2 эквивалент, как вы можете предположить:
SHOW SEQUENCE <SequenceName>; SHOW SEQUENCES;
Пожалуйста, обратите внимание, что команды SHOW... доступны только в инструменте isql. В отличие от GEN_ID, вы не можете использовать их из других клиентов (если эти клиенты не используют isql в качестве клиента).
<intvar> = GEN_ID(<GeneratorName>, 0);
СУБД Firebird 2: тот же самый синтаксис.
Так же, как и в случае получения текущего значения, это выполняется с помощью GEN_ID, но в этом случае вы используете значение шага, равное 1. При этом СУБД Firebird:
получает текущее значение генератора;
увеличивает его на 1;
возвращает измененное значение.
SELECT GEN_ID(<GeneratorName>, 1) FROM RDB$DATABASE;
Новый синтаксис, который предпочтителен для СУБД Firebird 2, полностью отличается:
SELECT NEXT VALUE FOR <SequenceName> FROM RDB$DATABASE;
<intvar> = GEN_ID(<GeneratorName>, 1);
Предпочтительно для СУБД Firebird 2 и старше:
<intvar> = NEXT VALUE FOR <SequenceName>;
SET GENERATOR <GeneratorName> TO <NewValue>;
Это удобно для установки в генераторе значения, отличного от 0 (которое является значением по умолчанию после его создания), например, в скрипте для создания базы данных. Аналогично CREATE GENERATOR, это оператор DDL (не DML).
Предпочтительный синтаксис для СУБД Firebird 2 и старше:
ALTER SEQUENCE <SequenceName> RESTART WITH <NewValue>;
GEN_ID(<GeneratorName>, <NewValue> - GEN_ID(<GeneratorName>, 0));
Это больше похоже на «грязный трюк» в попытке сделать то, что в обычных условиях сделать нельзя и не должно в хранимых процедурах и триггерах: установка значений генераторов. В них можно получать, а не устанавливать значения.
DROP GENERATOR <GeneratorName>;
Предпочтительно для СУБД Firebird 2 и старше:
DROP SEQUENCE <SequenceName>;
Невозможно, поскольку... (То же самое объяснение, что и для создания: вы не можете [или, скорее, не должны] изменять метаданные в PSQL.)
Удаление генератора не освобождает место, которое он занимает, для использования нового генератора. На практике это редко приводит к проблемам, поскольку большинство баз данных не имеют десятков тысяч генераторов, которые позволяет создавать СУБД Firebird. Но если ваша база данных рискует превысить 32767 генераторов, вы можете освободить место неиспользуемых генераторов путем выполнения операции резервного копирования/восстановления базы данных (backup/restore). При этом аккуратно упаковывается таблица RDB$GENERATORS, переназначаются идентификаторы (ID), образуя непрерывную последовательность. В зависимости от ситуации, восстановленной базе данных может понадобиться меньше страниц для хранения значений генераторов.
СУБД InterBase 6 и более ранние версии, точно так же, как и ранние версии СУБД Firebird, предшествующие версии 1.0, не имеют команды DROP GENERATOR. Единственным способом удалить генератор является оператор:
DELETE FROM RDB$GENERATORS WHERE RDB$GENERATOR_NAME = '<GeneratorName>';
...с последующим циклом резервирования/восстановления базы данных (backup/restore).
Для этих версий СУБД с максимальным количеством генераторов около пары сотен гораздо более вероятно появление необходимости использованть место от удаленных генераторов.
Документация Firebird → Документация по Firebird → Генераторы в Firebird → Операторы SQL для генераторов |