среда, 7 сентября 2011 г.

Autoincrement-поля и генераторы в СУБД Firebird

 По непонятным мне пока причинам, в СУБД Firebird autoincrement-поля реализуются с помощью системных переменных, не связанных напрямую с этими полями. Такие переменные называются генераторы. То есть, даже если вы создали поле типа autoincrement с целью использовать его как первичный ключ, при добавлении записи в таблицу вам явным образом понадобится указать значение этого поля присвоив ему значение, полученное от генератора. Иначе по умолчанию такое поле получит значение NULL.


Генераторы предназначены для получения уникальной последовательности целых чисел c определенным шагом, например:

  • 1,2,3,4,5...n
  • 100,200,300,400...n 
В SQL-коде генераторы создаются с помощью следующего оператора DDL:
CREATE GENERATOR имя_генератора
Установить начальное значение генератора можно так:

SET GENERATOR имя_генератора 1;  //устанавливаем начальное значение равное 1 

Увеличить значение генератора:
GEN_ID(имя_генератора, шаг);
Увеличим например значение генератора на 1000 и вставим в базу в поле типа autioncrement:

INSERT INTO MyTable(ID,TITLE) VALUES (GEN_ID(GEN_MYTABLE_ID,1000), 'Test')

Получить текущее значение генератора можно так:
GEN_ID(имя_генератора, 0) 

 Все созданные в базе генераторы, хранятся в системной таблице RDB$GENERATORS в виде пар имя/порядковый_номер_генератора.
Дипазон возможных значений генератора - от -263 .. 263 (64-битовое целое число).

Важно! Генераторы возвращают значение вне контекста транзакции пользователя, то есть, если значение  генератора в транзакции было увеличено, то даже если транзакция была отменена - значение генератора останется увеличенным.

Комментариев нет:

Отправить комментарий