Гость
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Один и тот же ID в двух разных таблицах / 7 сообщений из 7, страница 1 из 1
26.05.2014, 19:58
    #38652510
MocArt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Один и тот же ID в двух разных таблицах
Здравствуйте!
Прошу сильно не пинать, так как делетант в АйБи. Прошу объяснить, как и что нужно создать, чтобы при добавлении записи ID в таблице №1 со значением 1, создавалась такая же запись с идентичным ID в таблице №2 . Я сделал так: В первой таблице создал Генератор и Триггер с автоинкрементном +1. попытался добавить во второй таблице такое же поле: use exiting generator (выбрал генератор из таблицы №1) но при добавлении записи в первой таблице, во второй таки ничего не меняется и не появляется. что нужно поставить во второй? Заранее спасибо.
...
Рейтинг: 0 / 0
26.05.2014, 20:23
    #38652527
Kotъ-Begemotъ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Один и тот же ID в двух разных таблицах
Нужно создать два триггера: Триггер BEFORE INSERT для первой таблицы, где проверять, если "ключевое" поле IS NULL то получать ID с помощью генератора. И триггер AFTER INSERT для первой таблицы, в котором делать вставку во вторую таблицу, используя OLD.KEYFIELD первой таблицы для занесения этого ID.

Первый триггер IBExpert может создать автоматически, надо только поставить NotNull и AutoInc для поля, и указать/создать генератор. А второй триггер написать "руками".
...
Рейтинг: 0 / 0
27.05.2014, 04:18
    #38652687
MocArt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Один и тот же ID в двух разных таблицах
Kotъ-Begemotъ,

Имеем следующую структуру таблиц:
TABLE1
ID_TABLE1 - АИ +1

TABLE2
ID_TABLE2 - integer, not null

Написал вот такой триггер №2 для первой таблицы: (триггер №1 АИ)
Имя: TABLE2_AI0
Для таблицы: TABLE1
Тип: After
Код: plsql
1.
2.
3.
4.
5.
AS
begin
    if (new.id_table2 is null) then
    new.id_table2 = old.id_table1;
end



при компиляции выводится ошибка:

Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
NEW.ID_TABLE2 .
At line 5, column 13.

Очевидно, что компилятор не может понять, где эта колонка "NEW.ID_TABLE2", попытался ЯВНО указать на таблицу:
Код: plsql
1.
2.
3.
4.
5.
AS
begin
    if (new.table2.id_table2 is null) then
    new.table2.id_table2 = old.table1.id_table1;
end


но и тут меня поджидала неудача:

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 5, column 19.
.
...
Рейтинг: 0 / 0
27.05.2014, 09:37
    #38652757
o_v_a
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Один и тот же ID в двух разных таблицах
MocArt, не следует темы дублировать в разных форумах, тем более тут не в тему. В IB/Firebird-разделе уже создал ведь обсуждение...
...
Рейтинг: 0 / 0
27.05.2014, 09:57
    #38652783
Kotъ-Begemotъ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Один и тот же ID в двух разных таблицах
MocArt, в триггере на таблицу SOMETABLE с помощью префиксов OLD и NEW можно ссылаться только на поля ЭТОЙ же самой таблицы.
IBExpert сам генерит триггер на BI который берёт значение "автоинкрементного" поля из генератора.
А "руками" написать надо что-то типа этого (триггер на BI для TABLE1)

Код: sql
1.
INSERT INTO TABLE2(ID, ...., ....) VALUES (NEW.ID, ...., ....)
...
Рейтинг: 0 / 0
27.05.2014, 09:59
    #38652786
Kotъ-Begemotъ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Один и тот же ID в двух разных таблицах
Пардон, на After Insert, вот так:

А "руками" написать надо что-то типа этого (триггер на AI для TABLE1)
...
Рейтинг: 0 / 0
27.05.2014, 10:07
    #38652799
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Один и тот же ID в двух разных таблицах
Не понял, в чем загвоздка, вроде все просто.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
/******************************************************************************/
/***               Generated by IBExpert 27.05.2014 10:06:38                ***/
/******************************************************************************/

/******************************************************************************/
/***      Following SET SQL DIALECT is just for the Database Comparer       ***/
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/


CREATE GENERATOR GEN_SOMETABLE1_ID;

CREATE TABLE SOMETABLE1 (
    ID        ID NOT NULL /* ID = BIGINT NOT NULL */,
    SOMEDATA  CALENDARITEM /* CALENDARITEM = SMALLINT NOT NULL */
);




/******************************************************************************/
/***                              Primary Keys                              ***/
/******************************************************************************/

ALTER TABLE SOMETABLE1 ADD CONSTRAINT PK_SOMETABLE1 PRIMARY KEY (ID);


/******************************************************************************/
/***                                Triggers                                ***/
/******************************************************************************/


SET TERM ^ ;



/******************************************************************************/
/***                          Triggers for tables                           ***/
/******************************************************************************/



/* Trigger: SOMETABLE1_AI0 */
CREATE OR ALTER TRIGGER SOMETABLE1_AI0 FOR SOMETABLE1
ACTIVE AFTER INSERT POSITION 0
AS
begin
  insert into sometable2 (id) values (new.id);
end
^


/* Trigger: SOMETABLE1_BI */
CREATE OR ALTER TRIGGER SOMETABLE1_BI FOR SOMETABLE1
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_sometable1_id,1);
end
^

CREATE TABLE SOMETABLE2 (
    ID  ID NOT NULL /* ID = BIGINT NOT NULL */
);




/******************************************************************************/
/***                              Primary Keys                              ***/
/******************************************************************************/

ALTER TABLE SOMETABLE2 ADD CONSTRAINT PK_SOMETABLE2 PRIMARY KEY (ID);


SET TERM ; ^

...
Рейтинг: 0 / 0
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Один и тот же ID в двух разных таблицах / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]