C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
непонятки с autoinc в интербейз, механизм autoinc не работает
ExplodeMan
Отправлено: 11.08.2004, 13:25


Ученик-кочегар

Группа: Участник
Сообщений: 18



совсем недавно взялся изучать interbase. сразу же весьма удивил громоздкий механизм реализации автоинкремента в этой БД. вроде разобрался, но запустить аутоинк не получается. хотя, вроде, всё правильно:

//создал таблицу
CREATE TABLE CLIENT (
ID INTEGER NOT NULL,
FIO CHAR(25) CHARACTER SET WIN1251 NOT NULL,
CONSTRAINT CLIENT_PK PRIMARY KEY (ID)
);

//триггер
CREATE TRIGGER TRIG_GEN_CLIENT
ACTIVE BEFORE INSERT POSITION 0
AS
begin
if(new.id is null) then
new.id=gen_id(gen_client,1);
end

//генератор
CREATE GENERATOR GEN_CLIENT
set generator GEN_CLIENT to 1

в качестве сервера использую fb 1.0.2.
кто знает, подскажите что здесь не так? третий день уже долблюсь с этой ерундой sad.gif
olegenty
Отправлено: 11.08.2004, 13:55


Ветеран

Группа: Модератор
Сообщений: 2412



ну в приведённом сорце ошибка в синтаксисе реализации триггера.

а механизм не громоздкий, а замечательный, удобнее, чем где либо. потому что на одну таблицу можно назначать более одного генератора, т.е. более одного автоинкрементного поля.

поставь себе ibexpert, скачай с http://www.ibexpert.com/download — для русских бесплатен. он тебе всё это автоматически создаст.
Simai
Отправлено: 11.08.2004, 13:58


Ученик-кочегар

Группа: Участник
Сообщений: 15



У меня InterBase 6.0 и из оболочки (IB Expert) все работает.
Насколько я понял у тебя auto -increment не работет уже из проги.
Теоретически можно сделать процедуру вида

CREATE PROCEDURE GEN_ID
RETURNS (
N INTEGER)
AS
begin
N=GEN_CLIENT(gen_id,1);
end

и вызывать её при вставки новой записи
ExplodeMan
Отправлено: 11.08.2004, 16:27


Ученик-кочегар

Группа: Участник
Сообщений: 18



2olegenty
сорри, это я недописал. триггер у меня так описан:
CREATE TRIGGER TRIG_GEN_CLIENT for client
ACTIVE BEFORE INSERT POSITION 0
AS
begin
if(new.id is null) then
new.id=gen_id(gen_client,1);
end

ibexpert скачал, то же самое....

2Simai
в ibexpertе тоже при вставке поле id не заполняется.....
olegenty
Отправлено: 12.08.2004, 07:06


Ветеран

Группа: Модератор
Сообщений: 2412



Там всё работает. Я проект щас сдаю на Yaffil...

Опиши подробно проблему: где и что не заполняется после каких действий...
ExplodeMan
Отправлено: 12.08.2004, 15:12


Ученик-кочегар

Группа: Участник
Сообщений: 18



olegenty, может я чё не так понимаю, но по идее, если в приведённом выше коде ошибок нет (а ibexpert все скрипты откомпилячил и говорит, что нет ошибок), то при добавлении новой записи:

1. запускается триггер TRIG_GEN_CLIENT
2. значение генератора увеличивается на единицу
3. в поле ID автоматом вставляется значение из генератора.

т.е. происходит то, что всем нам знакомо как банальный автоинкремент.
может я что то недопонимаю в идеологии интербейза?
olegenty
Отправлено: 13.08.2004, 11:08


Ветеран

Группа: Модератор
Сообщений: 2412



всё так, здесь я вижу только одни грабли:
CODE

if(new.id is null) then...


у тебя точно NULL на входе? ты точно не воткнул туда значение по умолчанию???

Вернуться в Работа с базами данных в C++Builder