Автоинкремент или тип IDENTITY
Firebird не поддерживает типы автоинкремента или IDENTITY, которые вы могли встретить в других системах управления базами данных. Что у него есть, так это средство числовых генераторов и возможность поддерживать независимые, именованные серии чисел BIGINT. Каждая серия известна как генератор. Техника их использования для реализации и поддержки первичных ключей и других автоматических инкрементных серий описана в главе 31.
Генераторы являются идеальным средством для создания значений автоинкрементных уникальных ключей или серий значений числового столбца, а также других серий. Генераторы в базе данных объявляются оператором CREATE, как и любой другой объект базы данных:
CREATE GENERATOR AGenerator;
Генераторам может быть присвоено любое начальное значение:
SET GENERATOR AGenerator ТО 1;
! ! !
ВНИМАНИЕ! Существуют строгие предупреждения по поводу переустановки значений генераторов, когда эти значения находятся в использовании - см. разд. "Предупреждения о переустановке значений генераторов" в этой главе.
. ! .
Получение следующего значения
Для получения следующего значения вызывайте функцию SQL GEN_ID(ИмяГенератора, n), где имягенератора - имя генератора, а n - целое (диалект 1) или NUMERIC(18,0) (диалект 3), определяющее значение шага. Запрос:
SELECT GEN_ID(AGenerator, 2) from RDB$DATABASE;
возвращает число, которое на 2 больше последнего сгенерированного числа, и устанавливает значение генератора в сгенерированное значение.
Текущее значение генератора
Следующая строка:
SELECT GEN_ID(AGenerator, 0) from RDB$DATABASE;
возвращает текущее значение генератора без его увеличения [18] Часто таблица RDB$DATABASE используется для "пустых" запросов, которые возвращают одно вычисляемое значение или контекстную переменную. Это реальная системная таблица, содержащая одну и только одну строку. Она используется как DUAL В Oracle.
.
PSQL, язык программирования Firebird, позволяет напрямую присваивать сгенерированное значение переменной:
. . .
DECLARE VARIABLE MyVar BIGINT;
. . .
MyVar = GEN_ID(AGenerator, 1);
Более подробную информацию об использовании генераторов в модулях PSQL - в особенности в триггерах - см. в главе 29 [19] Несмотря на то, что в третьем диалекте генераторы являются числами BIGINT, совершенно необязательно столбец первичного ключа, для которого будет применяться генератор, также делать BIGINT. При выборе типа данных для столбца первичного ключа следует учитывать конкретные нужды предметной области. Как правило, в большинстве случаев вполне достаточно INTEGER. - Прим. науч. ред.
.
Использование отрицательного шага
Аргумент шаг в GEN_ID может быть отрицательным. Следовательно, можно устанавливать или переустанавливать текущее значение генератора, передавая отрицательный аргумент или в виде целой константы, или в виде целого выражения. Эта возможность иногда используется как "трюк" для установки значений генератора в PSQL, поскольку в PSQL не могут использоваться такие команды DDL, как SET GENERATOR.
Например, оператор:
SELECT GEN_ID (AGenerator, -GEN_ID (AGenerator, 0)) from RDB$DATABASE;
устанавливает значение генератора в ноль.
Предупреждения о переустановке значений генераторов
Основное простое правило по переустановке значений генераторов в работающей базе данных - будь то в SQL, PSQL или в некотором интерфейсе администратора - не делать этого.
Основное достоинство значений генератора то, что они гарантированно являются уникальными. В отличие от других доступных пользователю операций Firebird генераторы работают вне контекста транзакций. Однажды сгенерированное, число установлено и не может быть изменено отменой транзакции. Это дает полную уверенность в том, что ничто не может вмешиваться в целостность последовательности чисел, предоставляемых генератором.
Оставьте переустановку значений генераторов в создаваемой базе данных для редких случаев, когда это требуется условиями проектирования. Например, некоторые бухгалтерские системы, написанные в старом стиле, передают журналы в таблицы истории с новым первичным ключом, очищают таблицу журналов и устанавливают последовательность первичных ключей в ноль в организациях с несколькими филиалами, выделяя диапазоны значений ключа каждого филиала в отдельный "фрагмент", чтобы гарантировать целостность ключей при репликации.
Никогда не переустанавливайте значения генератора в попытке скорректировать программные ошибки, ошибки ввода данных или для "устранения промежутков" в последовательности значений [20] Существуют техники для поддержки непрерывных последовательностей с использованием генераторов, которые могут быть реализованы в случае абсолютной необходимости повторного применения неиспользуемых промежутков в сериях, не являющихся значениями ключа. Список Tech Info "Контролируемые серии чисел" (An Auditable Series of Numbers) описывает подобную технику на http://www.ibobjects.com/TechInfo.html.
.
Читать дальше