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

Вниз

Как узнать номер добавленной записи   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
15-1262873481
anton773
2010-01-07 17:11
2010.03.28
Пожиратель траффика!!!


15-1260785196
xayam
2009-12-14 13:06
2010.03.28
Потестируйте пожалуйста поисковик DMSearch 2.0


2-1264603718
d.l.
2010-01-27 17:48
2010.03.28
try..finally


15-1262818935
Дмитрий С
2010-01-07 02:02
2010.03.28
DLL во все процессы.


2-1263942655
Вася
2010-01-20 02:10
2010.03.28
Можно ли отключить "куб отсечения" в OpenGL