![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать номер добавленной записи [D7]
Den © (2009-03-15 12:43:00)Использую Firebird (точнее только начал изучать :), имеется несколько таблиц, одна мастер-таблица, пара таблиц связаны с ней, отношение один-ко-многим. В мастер-таблицу добавляю новую запись, в столбце ID генерится уникальное значение с помощью генератора. Как получить это значение для вставки записей в подчиненные таблицы?
Медвежонок Пятачок (2009-03-19 11:51:00) [1]разумеется.
StriderMan (2009-03-19 11:50:00) [2]
> для фиба и ретурнинг не обязателен.
> достаточно указать ключевое поле, имя генератора и момент
> когда нужно стянуть его новое значение.
думается на низком уровне он пуляет как раз два запроса :)
Медвежонок Пятачок (2009-03-19 10:58:00) [3]для фиба и ретурнинг не обязателен.
достаточно указать ключевое поле, имя генератора и момент когда нужно стянуть его новое значение.
Den (2009-03-19 10:48:00) [4]Попробовал все варианты, RETURNING похоже больше всего подходит (используя FB 2.1+FIBPlus)
StriderMan (2009-03-18 17:36:00) [5]не дописал:
на низком уровне для получения результатов что ХП что RETURNING между клиентом и сервером
совершаются телодвижения, затраты трафика на которые сравнимы с еще одним запросом. Тестировали специально этот момент
StriderMan (2009-03-18 17:35:00) [6]
> Виталий Панасенко (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 между клиентом и сервером
YurikGL (2009-03-17 20:06:00) [7]Писал в соседней ветке...
Добавляем запись в таблицу не через 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-к куда угодно (вернее, откуда вставили, туда и возвратит)....
palva (2009-03-16 21:45:00) [8]Den (15.03.09 14:27) [3]
> Наверно так: вставляем в мастер-таблицу запись, получаем
> новое сгенерированное значение ID...
Нет не так. Сначала вы получаете новое значение, а и только потом вставляете новую запись, задавая для вставки сгенерированное значение ID явно. Триггер при этом работать не должен - можете его отключить.
Экономнее всего сделать это в хранимой процедуре, которая должна вставить запись и вернуть единственное значение - номер ID. Но можно обойтись без процедуры - двумя запросами. Первый запрос указали в [10], при этом вы вытащите ID на клиент. Второй запрос будет вставкой записи.
Правильный$Вася (2009-03-16 19:03:00) [9]
> получить значение генератора можно отдельным запросом select
> gen_id(generator_name, 1) from rdb$database
уточнение: следующеезначение
в многопользовательской среде годится для последующего использования
текущеезначение получать не рекомендуется, бо оно уже могло быть изменено другим пользователем
Виталий Панасенко (2009-03-16 10:24:00) [10]а получить значение генератора можно отдельным запросом select gen_id(generator_name, 1) from rdb$database
Виталий Панасенко (2009-03-16 10:22:00) [11]
> Медвежонок Пятачок © (16.03.09 09:36) [8]
Да, но если автор использует для доступа IBX, то они, насколько мне известно, не поддерживают эту конструкцию
Медвежонок Пятачок (2009-03-16 09:36:00) [12]в 2.x в инсерте поддерживается returning
Cobalt (2009-03-15 23:08:00) [13]6-ю вопросами ранее, в той же конференции:
ID последней добавленной записи (DVM 12.03.09 15:12)
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1220515408&n=1
Кролик Иа-Иа (2009-03-15 21:51:00) [14]http://www.ibase.ru/devinfo/generator.htm
http://www.ibase.ru/devinfo/dontdoit.htm
http://www.ibase.ru/develop.htm
Den (2009-03-15 21:01:00) [15]
> В теле триггера ?
Можно в теле триггера если это возможно, или как иначе....пока на ум приходит только select max(id) from.... :)) знаю что это неправильно, тут рядом ветка есть с подобным вопросом...
Сергей М. (2009-03-15 19:58:00) [16]
> Как получить это значение
В теле триггера ?
Den (2009-03-15 14:27:00) [17]
> А обеспечивает вставку генерированного значения наверно,
> триггер?
Именно так. Т.е. Вы предлагаете вставлять данные в подчиненные таблицы в ХП? Наверно так: вставляем в мастер-таблицу запись, получаем новое сгенерированное значение ID (не очень понял правда как сделать "ручное" генерирование, с генератором+триггер все понятно) и далее уже вставляем записи с полученным ID в подчиненные таблицы?
palva (2009-03-15 14:09:00) [18]А обеспечивает вставку генерированного значения наверно, триггер?
Так вставляйте запись с помощью хранимой процедуры. Генерируйте в ней ID вручную используйте его для вставки, а затем возвращайте из процедуры.
Den (2009-03-15 12:44:00) [19]Таблицы связаны по полю ID, ключевое