Форум: "Базы";
Текущий архив: 2010.03.28;
Скачать: [xml.tar.bz2];
ВнизКак узнать номер добавленной записи Найти похожие ветки
← →
Den (2009-03-15 12:43) [0]Использую Firebird (точнее только начал изучать :), имеется несколько таблиц, одна мастер-таблица, пара таблиц связаны с ней, отношение один-ко-многим. В мастер-таблицу добавляю новую запись, в столбце ID генерится уникальное значение с помощью генератора. Как получить это значение для вставки записей в подчиненные таблицы?
← →
Den (2009-03-15 12:44) [1]Таблицы связаны по полю ID, ключевое
← →
palva © (2009-03-15 14:09) [2]А обеспечивает вставку генерированного значения наверно, триггер?
Так вставляйте запись с помощью хранимой процедуры. Генерируйте в ней ID вручную используйте его для вставки, а затем возвращайте из процедуры.
← →
Den (2009-03-15 14:27) [3]
> А обеспечивает вставку генерированного значения наверно,
> триггер?
Именно так. Т.е. Вы предлагаете вставлять данные в подчиненные таблицы в ХП? Наверно так: вставляем в мастер-таблицу запись, получаем новое сгенерированное значение ID (не очень понял правда как сделать "ручное" генерирование, с генератором+триггер все понятно) и далее уже вставляем записи с полученным ID в подчиненные таблицы?
← →
Сергей М. © (2009-03-15 19:58) [4]
> Как получить это значение
В теле триггера ?
← →
Den (2009-03-15 21:01) [5]
> В теле триггера ?
Можно в теле триггера если это возможно, или как иначе....пока на ум приходит только select max(id) from.... :)) знаю что это неправильно, тут рядом ветка есть с подобным вопросом...
← →
Кролик Иа-Иа © (2009-03-15 21:51) [6]http://www.ibase.ru/devinfo/generator.htm
http://www.ibase.ru/devinfo/dontdoit.htm
http://www.ibase.ru/develop.htm
← →
Cobalt © (2009-03-15 23:08) [7]6-ю вопросами ранее, в той же конференции:
ID последней добавленной записи (DVM 12.03.09 15:12)
http://delphimaster.net/view/3-1220515408/
← →
Медвежонок Пятачок © (2009-03-16 09:36) [8]в 2.x в инсерте поддерживается returning
← →
Виталий Панасенко (2009-03-16 10:22) [9]
> Медвежонок Пятачок © (16.03.09 09:36) [8]
Да, но если автор использует для доступа IBX, то они, насколько мне известно, не поддерживают эту конструкцию
← →
Виталий Панасенко (2009-03-16 10:24) [10]а получить значение генератора можно отдельным запросом select gen_id(generator_name, 1) from rdb$database
← →
Правильный$Вася (2009-03-16 19:03) [11]
> получить значение генератора можно отдельным запросом select
> gen_id(generator_name, 1) from rdb$database
уточнение: следующее значение
в многопользовательской среде годится для последующего использования
текущее значение получать не рекомендуется, бо оно уже могло быть изменено другим пользователем
← →
palva © (2009-03-16 21:45) [12]Den (15.03.09 14:27) [3]
> Наверно так: вставляем в мастер-таблицу запись, получаем
> новое сгенерированное значение ID...
Нет не так. Сначала вы получаете новое значение, а и только потом вставляете новую запись, задавая для вставки сгенерированное значение ID явно. Триггер при этом работать не должен - можете его отключить.
Экономнее всего сделать это в хранимой процедуре, которая должна вставить запись и вернуть единственное значение - номер ID. Но можно обойтись без процедуры - двумя запросами. Первый запрос указали в [10], при этом вы вытащите ID на клиент. Второй запрос будет вставкой записи.
← →
YurikGL © (2009-03-17 20:06) [13]Писал в соседней ветке...
Добавляем запись в таблицу не через insert а через хранимку видаCREATE PROCEDURE ADDUPR (
naimenovan varchar(50),
primech varchar(200))
returns (
id integer)
as
begin
ID = gen_id(g_upr, 1);
insert into upr (IdUpr,Naimenovan,Primech) values(:ID,:NAIMENOVAN,:primech);
end
Хранимка возвращает id-к куда угодно (вернее, откуда вставили, туда и возвратит)....
← →
StriderMan (2009-03-18 17:35) [14]
> Виталий Панасенко (16.03.09 10:22) [9]
> Да, но если автор использует для доступа IBX, то они, насколько
> мне известно, не поддерживают эту конструкцию
ща проверил на TIBSQL - полет нормальный, возвращает.:
IBSQL1.SQL.Text := "INSERT INTO TABLE1 (ID, NAME) " +
"VALUES(GEN_ID(GID, 1), ""zzzz"") " +
"RETURNING ID";
IBSQL1.ExecQuery;
ShowMessage(IBSQL1.FieldByName("ID").AsString);
C TIBQuery не получилось.
Сам обычно пользуюсь способом
а получить значение генератора можно отдельным запросом
select gen_id(generator_name, 1) from rdb$database
городить на каждую таблицу ХП для вставки считаю нецелесообразно. слишком много лишних телодвижений при добавлении новых полей в таблицы.
Кстати, что касается экономии, один запрос или два, на низком уровне для получения результатов что ХП что RETURNING между клиентом и сервером
← →
StriderMan (2009-03-18 17:36) [15]не дописал:
на низком уровне для получения результатов что ХП что RETURNING между клиентом и сервером
совершаются телодвижения, затраты трафика на которые сравнимы с еще одним запросом. Тестировали специально этот момент
← →
Den (2009-03-19 10:48) [16]Попробовал все варианты, RETURNING похоже больше всего подходит (используя FB 2.1+FIBPlus)
← →
Медвежонок Пятачок © (2009-03-19 10:58) [17]для фиба и ретурнинг не обязателен.
достаточно указать ключевое поле, имя генератора и момент когда нужно стянуть его новое значение.
← →
StriderMan (2009-03-19 11:50) [18]
> для фиба и ретурнинг не обязателен.
> достаточно указать ключевое поле, имя генератора и момент
> когда нужно стянуть его новое значение.
думается на низком уровне он пуляет как раз два запроса :)
← →
Медвежонок Пятачок © (2009-03-19 11:51) [19]разумеется.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2010.03.28;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c