Книга: Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Генераторы
Разделы на этой странице:
Генераторы
Генераторы являются идеальным средством для создания значений автоинкрементных уникальных ключей или серий значений числового столбца, а также других серий. Генераторы в базе данных объявляются оператором 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].
PSQL, язык программирования Firebird, позволяет напрямую присваивать сгенерированное значение переменной:
. . .
DECLARE VARIABLE MyVar BIGINT;
. . .
MyVar = GEN_ID(AGenerator, 1);
Более подробную информацию об использовании генераторов в модулях PSQL - в особенности в триггерах - см. в главе 29[19].
Использование отрицательного шага
Аргумент шаг в GEN_ID может быть отрицательным. Следовательно, можно устанавливать или переустанавливать текущее значение генератора, передавая отрицательный аргумент или в виде целой константы, или в виде целого выражения. Эта возможность иногда используется как "трюк" для установки значений генератора в PSQL, поскольку в PSQL не могут использоваться такие команды DDL, как SET GENERATOR.
Например, оператор:
SELECT GEN_ID (AGenerator, -GEN_ID (AGenerator, 0)) from RDB$DATABASE;
устанавливает значение генератора в ноль.
Предупреждения о переустановке значений генераторов
Основное простое правило по переустановке значений генераторов в работающей базе данных - будь то в SQL, PSQL или в некотором интерфейсе администратора - не делать этого.
Основное достоинство значений генератора то, что они гарантированно являются уникальными. В отличие от других доступных пользователю операций Firebird генераторы работают вне контекста транзакций. Однажды сгенерированное, число установлено и не может быть изменено отменой транзакции. Это дает полную уверенность в том, что ничто не может вмешиваться в целостность последовательности чисел, предоставляемых генератором.
Оставьте переустановку значений генераторов в создаваемой базе данных для редких случаев, когда это требуется условиями проектирования. Например, некоторые бухгалтерские системы, написанные в старом стиле, передают журналы в таблицы истории с новым первичным ключом, очищают таблицу журналов и устанавливают последовательность первичных ключей в ноль в организациях с несколькими филиалами, выделяя диапазоны значений ключа каждого филиала в отдельный "фрагмент", чтобы гарантировать целостность ключей при репликации.
Никогда не переустанавливайте значения генератора в попытке скорректировать программные ошибки, ошибки ввода данных или для "устранения промежутков" в последовательности значений[20].
- 7.6. Генераторы
- Аддитивные генераторы
- Тасующие генераторы
- 8.3.7. Объекты-генераторы
- Генераторы - лучшие друзья первичных ключей
- 11.4.3. Генераторы
- 11.4.4. Генераторы массивов
- 11.4.5. Выражения-генераторы
- Таблицы. Первичные ключи и генераторы
- 15.3. Генераторы специализированного кода
- Генераторы текста не должны быть слишком сложными
- 20 Генераторы текстов программ