Firebird Documentation IndexГенераторы в Firebird → Операторы SQL для генераторов
Firebird Home Firebird Home Пред.: Основные положения о генераторахFirebird Documentation IndexУровень выше: Генераторы в 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

Хотя в СУБД 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.

Создание генератора («Insert»)

Клиентский SQL
CREATE GENERATOR <GeneratorName>;

Предпочтительно для СУБД Firebird 2 и старше:

CREATE SEQUENCE <SequenceName>;
PSQL

Невозможно. Так как вы не можете изменять метаданные базы данных в хранимых процедурах (stored procedures) или триггерах, вы не можете создавать генераторы.

Замечание

В СУБД Firebird 1.5 и старше вы можете обходить это ограничение с помощью оператора EXECUTE STATEMENT.

Получение текущего значения («Select»)

Клиентский SQL
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 в качестве клиента).

PSQL
<intvar> = GEN_ID(<GeneratorName>, 0);

СУБД Firebird 2: тот же самый синтаксис.

Генерация следующего значения («Update» + «Select»)

Так же, как и в случае получения текущего значения, это выполняется с помощью GEN_ID, но в этом случае вы используете значение шага, равное 1. При этом СУБД Firebird:

  1. получает текущее значение генератора;

  2. увеличивает его на 1;

  3. возвращает измененное значение.

Клиентский SQL
SELECT GEN_ID(<GeneratorName>, 1) FROM RDB$DATABASE;

Новый синтаксис, который предпочтителен для СУБД Firebird 2, полностью отличается:

SELECT NEXT VALUE FOR <SequenceName> FROM RDB$DATABASE;
PSQL
<intvar> = GEN_ID(<GeneratorName>, 1);

Предпочтительно для СУБД Firebird 2 и старше:

<intvar> = NEXT VALUE FOR <SequenceName>;

Прямое указание определенного значения генератора («Update»)

Клиентский SQL
SET GENERATOR <GeneratorName> TO <NewValue>;

Это удобно для установки в генераторе значения, отличного от 0 (которое является значением по умолчанию после его создания), например, в скрипте для создания базы данных. Аналогично CREATE GENERATOR, это оператор DDL (не DML).

Предпочтительный синтаксис для СУБД Firebird 2 и старше:

ALTER SEQUENCE <SequenceName> RESTART WITH <NewValue>;
PSQL
GEN_ID(<GeneratorName>, <NewValue> - GEN_ID(<GeneratorName>, 0));

Внимание

Это больше похоже на «грязный трюк» в попытке сделать то, что в обычных условиях сделать нельзя и не должно в хранимых процедурах и триггерах: установка значений генераторов. В них можно получать, а не устанавливать значения.

Удаление генератора («Delete»)

Клиентский SQL
DROP GENERATOR <GeneratorName>;

Предпочтительно для СУБД Firebird 2 и старше:

DROP SEQUENCE <SequenceName>;
PSQL

Невозможно, поскольку... (То же самое объяснение, что и для создания: вы не можете [или, скорее, не должны] изменять метаданные в PSQL.)

Удаление генератора не освобождает место, которое он занимает, для использования нового генератора. На практике это редко приводит к проблемам, поскольку большинство баз данных не имеют десятков тысяч генераторов, которые позволяет создавать СУБД Firebird. Но если ваша база данных рискует превысить 32767 генераторов, вы можете освободить место неиспользуемых генераторов путем выполнения операции резервного копирования/восстановления базы данных (backup/restore). При этом аккуратно упаковывается таблица RDB$GENERATORS, переназначаются идентификаторы (ID), образуя непрерывную последовательность. В зависимости от ситуации, восстановленной базе данных может понадобиться меньше страниц для хранения значений генераторов.

Удаление генераторов в старых версиях IB и Firebird

СУБД InterBase 6 и более ранние версии, точно так же, как и ранние версии СУБД Firebird, предшествующие версии 1.0, не имеют команды DROP GENERATOR. Единственным способом удалить генератор является оператор:

DELETE FROM RDB$GENERATORS WHERE RDB$GENERATOR_NAME = '<GeneratorName>';

...с последующим циклом резервирования/восстановления базы данных (backup/restore).

Для этих версий СУБД с максимальным количеством генераторов около пары сотен гораздо более вероятно появление необходимости использованть место от удаленных генераторов.

Пред.: Основные положения о генераторахFirebird Documentation IndexУровень выше: Генераторы в FirebirdСлед.: Генераторы для создания идентификаторов строк
Firebird Documentation IndexГенераторы в Firebird → Операторы SQL для генераторов