Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.01.03;
Скачать: CL | DM;

Вниз

Вставка данных в две таблицы   Найти похожие ветки 

 
TL   (2009-01-15 09:39) [0]

Добрый день!

Суть вопроса такова:
Имеются две связанные таблицы:

Таблица1 (Ид_Таблица1, поле1, поле2, ...полеN)
Таблица2 (Ид_Таблица2, Ид_Таблица1, поле3, поле4...полеN)

Связь между ними : Таблица1.Ид_Таблица1 = Таблица2.Ид_Таблица1

Для каждой таблицы имеются триггеры и генераторы.

Необходимо, что бы при вставке данных(Ид_Таблица1, поле1, поле2, ...полеN) в "Таблица1", в "Таблица2" тоже вносились данные(Ид_Таблица2, Ид_Таблица1, поле3, поле4...полеN).

Буду рад проведеному ликбезу...


 
Sergey13 ©   (2009-01-15 09:58) [1]

> [0] TL   (15.01.09 09:39)
> IB5.x
А похуже ничего нет? Судя по отзывам - самая левая версия сервера.

> Буду рад проведеному ликбезу...
Суть идеи в том, что генерировать новое значение ключа можно прямо в тригере при вставке, а можно заранее, перед вставкой. И после этого оперировать этим значением при инсертах в дочерние таблицы.


 
TL   (2009-01-15 10:10) [2]

в тригере, для Таблица1, генерируется новое значение ключа ИД_Таблица1 перед вставкой, но, несовсем понимаю, как написать тригер, чтобы в нем, сразу же после сгенерированого ИД_Таблица1, делалась вставка данных в Таблица2 с этим NEW.ИД_Таблица1...


 
Sergey13 ©   (2009-01-15 10:14) [3]

> [2] TL   (15.01.09 10:10)
> в тригере, для Таблица1, генерируется новое значение ключа
> ИД_Таблица1 перед вставкой

В этом случае не надо для Т1 генерировать в тригере. Надо заранее. Т.е. в тригере должна стоять проверка
if :new.id is null then :new.id=GenId(tr1,1)


 
TL   (2009-01-15 10:29) [4]

ага...так оно и есть...
меня больше всего волнует, как сразу после того, как сгенерировали ключ в Т1, сделать вставку данных в Т2 ...

if  New.ИД_Таблица1 is null then New.ИД_Таблица1 = gen(ГенераторТ1,1);
/*хочу вставить значения в Т2*/
 ??????????
insert into Таблица2 (Ид_Таблица2, Ид_Таблица1, поле3, поле4...полеN) ?????


 
Медвежонок Пятачок ©   (2009-01-15 10:32) [5]

сказали же, сначала получаешь значение генератора, потом делаешь два инсерта с явным ключем.


 
Sergey13 ©   (2009-01-15 10:35) [6]

> [4] TL   (15.01.09 10:29)
> меня больше всего волнует, как сразу после того, как сгенерировали
> ключ в Т1, сделать вставку данных в Т2 ...

Cразу после того, как сгенерировали ключ в Т1 надо вставить запись в Т1. А вот потом вставлять уже в подчиненную Т2. Отдельным запросом.


 
TL   (2009-01-15 10:40) [7]

сгенерировали ключ,
сделали вставку данных в Т1,
как "запомнить" значение ИД_Таблица1, что бы его же вставить и в Таблица2 вторым запросом?


 
Медвежонок Пятачок ©   (2009-01-15 10:45) [8]

ид_таблица1 у тебя уже есть перед инсертом в обе таблицы


 
Sergey13 ©   (2009-01-15 10:48) [9]

> [7] TL   (15.01.09 10:40)
> сгенерировали ключ,
> сделали вставку данных в Т1
> как "запомнить" значение ИД_Таблица1, что бы его же вставить и в Таблица2 вторым запросом?

Т.е. до вставки в Т1 ты его помнил, а потом забыл?


 
TL   (2009-01-15 13:05) [10]

можно пример?


 
Sergey13 ©   (2009-01-15 13:18) [11]

> [10] TL   (15.01.09 13:05)

Пример чего? Ты сам пишешь только русско-язычную отсебятину вместо кода. Что конкретно и как конкретно не получается.


 
TL   (2009-01-15 13:37) [12]

Делаю первый Insert:
Insert into table_1 (ident, field_date, field_number, field_date1, field_number1) values (:ident, :date, :number, :date1, :number1)

перед вставкой получаем id_table1

Делаю второй Insert:
Insert into Table_2 (id_table1, field_naim, field_count, field_price )
values (:id, :naim, :fc, :fp)

как в id присвоить полученное значение из триггера, т .е id_table1?


 
Sergey13 ©   (2009-01-15 14:03) [13]

> [12] TL   (15.01.09 13:37)
> перед вставкой получаем id_table1

Как?


 
TL   (2009-01-15 14:15) [14]

if ( NEW.id_table1 is null ) then NEW.id_table1 = gen_id(gentable1,1);


 
Sergey13 ©   (2009-01-15 14:22) [15]

> [14] TL   (15.01.09 14:15)

В тригере? А надо ДО ВСТАВКИ в ОТДЕЛЬНОМ ЗАПРОСЕ из клиента.
В тригере идет ПРОВЕРКА на нул. Если тебе не нужен вставляемый ид-шник, то можно переложить его генерение на тригер. В твоем случае это не нужно. Нужно вставлять в запрос на вставку в Т1 заранее сгенеренное значение.


 
TL   (2009-01-15 15:00) [16]

будет ли корректным запрос с "клиента" , для получения ID:

select first 1 id_table1+1
from table_1
order by id_table1 desc

?


 
Sergey13 ©   (2009-01-15 15:02) [17]

> [16] TL   (15.01.09 15:00)
> будет ли корректным

С точки зрения синтаксиса будер корректно.
С точки зрения логики работы нет.
Если мне не изменяет память нужно спрашивать
select GenId(triger,1) from rdb$database


 
Виталий Панасенко(дом)   (2009-01-16 22:19) [18]


> Sergey13 ©   (15.01.09 15:02) [17]

Не обязательно..Просто в этой системной таблицы всегда(пока?) одна запись


 
Труп Васи Доброго ©   (2009-01-22 16:39) [19]

БЛин, ты хоть напиши где ты это пишешь...
Если это в ХП, то введи переменные и присвой им значения генераторов, а потом вставляй их куда угодно.



Страницы: 1 вся ветка

Текущий архив: 2010.01.03;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.013 c
15-1257172006
Loky1984
2009-11-02 17:26
2010.01.03
Не запускается Delphi6


15-1257122587
Eraser
2009-11-02 03:43
2010.01.03
Протокол и GNU


15-1257283812
Юрий
2009-11-04 00:30
2010.01.03
С днем рождения ! 4 ноября 2009 среда


2-1258041289
Zahar
2009-11-12 18:54
2010.01.03
Занят ли файл


2-1257999548
Андрей Смирнов
2009-11-12 07:19
2010.01.03
Как доработать функцию поиска, для работы в цикле?