Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
15-1263074944
Илья_
2010-01-10 01:09
2010.03.28
Игра FIFA 2010 по сети


2-1264496780
Oleg196lora
2010-01-26 12:06
2010.03.28
Странность в работе try..except


2-1264674919
novichek
2010-01-28 13:35
2010.03.28
Image на переднем плане


1-1246435353
iFynk
2009-07-01 12:02
2010.03.28
DLL и контролы


15-1263146426
Petr V. Abramov
2010-01-10 21:00
2010.03.28
RBC празднует :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский