Конференция "Базы" » Вставка данных в две таблицы [D6, IB5.x]
 
  • TL (15.01.09 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 © (15.01.09 09:58) [1]
    > [0] TL   (15.01.09 09:39)
    > IB5.x
    А похуже ничего нет? Судя по отзывам - самая левая версия сервера.

    > Буду рад проведеному ликбезу...
    Суть идеи в том, что генерировать новое значение ключа можно прямо в тригере при вставке, а можно заранее, перед вставкой. И после этого оперировать этим значением при инсертах в дочерние таблицы.
  • TL (15.01.09 10:10) [2]
    в тригере, для Таблица1, генерируется новое значение ключа ИД_Таблица1 перед вставкой, но, несовсем понимаю, как написать тригер, чтобы в нем, сразу же после сгенерированого ИД_Таблица1, делалась вставка данных в Таблица2 с этим NEW.ИД_Таблица1...
  • Sergey13 © (15.01.09 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 (15.01.09 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) ?????
  • Медвежонок Пятачок © (15.01.09 10:32) [5]
    сказали же, сначала получаешь значение генератора, потом делаешь два инсерта с явным ключем.
  • Sergey13 © (15.01.09 10:35) [6]
    > [4] TL   (15.01.09 10:29)
    > меня больше всего волнует, как сразу после того, как сгенерировали
    > ключ в Т1, сделать вставку данных в Т2 ...

    Cразу после того, как сгенерировали ключ в Т1 надо вставить запись в Т1. А вот потом вставлять уже в подчиненную Т2. Отдельным запросом.
  • TL (15.01.09 10:40) [7]
    сгенерировали ключ,
    сделали вставку данных в Т1,
    как "запомнить" значение ИД_Таблица1, что бы его же вставить и в Таблица2 вторым запросом?
  • Медвежонок Пятачок © (15.01.09 10:45) [8]
    ид_таблица1 у тебя уже есть перед инсертом в обе таблицы
  • Sergey13 © (15.01.09 10:48) [9]
    > [7] TL   (15.01.09 10:40)
    > сгенерировали ключ,
    > сделали вставку данных в Т1
    > как "запомнить" значение ИД_Таблица1, что бы его же вставить и в Таблица2 вторым запросом?

    Т.е. до вставки в Т1 ты его помнил, а потом забыл?
  • TL (15.01.09 13:05) [10]
    можно пример?
  • Sergey13 © (15.01.09 13:18) [11]
    > [10] TL   (15.01.09 13:05)

    Пример чего? Ты сам пишешь только русско-язычную отсебятину вместо кода. Что конкретно и как конкретно не получается.
  • TL (15.01.09 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 © (15.01.09 14:03) [13]
    > [12] TL   (15.01.09 13:37)
    > перед вставкой получаем id_table1

    Как?
  • TL (15.01.09 14:15) [14]
    if ( NEW.id_table1 is null ) then NEW.id_table1 = gen_id(gentable1,1);
  • Sergey13 © (15.01.09 14:22) [15]
    > [14] TL   (15.01.09 14:15)

    В тригере? А надо ДО ВСТАВКИ в ОТДЕЛЬНОМ ЗАПРОСЕ из клиента.
    В тригере идет ПРОВЕРКА на нул. Если тебе не нужен вставляемый ид-шник, то можно переложить его генерение на тригер. В твоем случае это не нужно. Нужно вставлять в запрос на вставку в Т1 заранее сгенеренное значение.
  • TL (15.01.09 15:00) [16]
    будет ли корректным запрос с "клиента" , для получения ID:

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

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

    С точки зрения синтаксиса будер корректно.
    С точки зрения логики работы нет.
    Если мне не изменяет память нужно спрашивать
    select GenId(triger,1) from rdb$database
  • Виталий Панасенко(дом) (16.01.09 22:19) [18]

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

    Не обязательно..Просто в этой системной таблицы всегда(пока?) одна запись
 
Конференция "Базы" » Вставка данных в две таблицы [D6, IB5.x]
Есть новые Нет новых   [134477   +40][b:0][p:0.001]