Использование генераторов.
Если в состав первичного или уникального ключа входят поля, значения которых должны быть уникальны, это можно обеспечить следующими способами:
формирование уникального значения пользователем по определенному алгоритму (например номер лицевого счета в банке);
выработка уникального значения сервером базы данных.
Для установки уникальных значений столбцов в InterBase используется аппарат генератора.
Генератором, называется хранимый на сервере БД механизм, возвращающий уникальные значения, никогда не совпадающие со значениями, выданными тем же самым генератором в прошлом.
Для создания генератора используется следующий оператор:
CREATE GENERATOR <имя генератора>
Установка стартового значения:
SET GENERATOR <имя генератора> TO <стартовое значение>
Для получения уникального значения используется функция:
GEN_ID (ИмяГенератора, шаг)
Не рекомендуется переустанавливать стартовое значение генератора или менять шаг при разных обращениях к функции GEN_ID. В этих случаях генератор может выдать не уникальное значение и как следствие будет возбуждено исключение при попытке запоминания новой записи в таблице базы данных.
Примеры:
1.Пусть в БД определен генератор для столбца N_Rashod в таблице RASHOD:
CREATE GENERATOR RAS_G;
SET GENERATOR RAS_S TO 0;
Обращение к генератору непосредственно из оператора INSERT:
INSERT INTO RASHOD (N_RASH, DATE_RASH, KOLVO, TOVAR, POKUP)
VALUES (GEN_ID (RAS_G, 1),”10-JAN-2000”,100,”Cахар”, ”ООО Ромашка”)
2.Присваивание ключевому столбцу уникального значения может быть реализовано с помощью триггера, вызываемого перед запоминанием новой записи в БД:
CREATE TRIGGER BI_RAS FOR RASHOD
ACTIVE
BEFORE INSERT
AS
BEGIN
NEW.RAS = GEN_ID (RAS_G, 1)
END
При этом в клиентском приложении, реализующем добавление новых записей в таблицу, столбец с уникальными значениями (N_RASH) в программе не заполняется и оператор INSERT имеет вид
INSERT INTO RASHOD (N_RASH, DATE_RASH, KOLVO, TOVAR, POKUP)
VALUES (:DATE_RASH, :KOLVO, :TOVAR, :POKUP)
Пример хранимой процедуры, которую можно использовать для генерирования значений:
CREATE PROCEDURE GET_RAS
RETURNS (NR INTEGER)
AS
BEGIN
NR=GEN_ID (RAS_G, 1)
SUSPEND
END