Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как узнать ID только что добавленной записе в InterBase [D6, IB6.x]


Страницы:   1 2

YK ©   (2005-01-31 11:26:00) 

Уважаемые Мастера!
Подскажите как узнать ID (автоинкрементное через триггер)
толко что созданной записи в InterBase/
 В MS-SQL я знаю, а в InterBase нет :(
P.S.
Может подскажите где найти электронный учебник
по SQL в InterBase?


HSolo   (2005-02-01 08:49:00) [21]

>Всё-таки почему нельза использовать
GEN_ID(T_ID_GEN,0) , если я делаю это в той же транзакции?

Т.е. Вы хотите получить текущее значение генератора, потом увеличить его на 1 и это значение записать в базу, так?

А кто увеличит значение генератора? Или он какой был, такой и останется? И что Вы тогда получите при следующем GEN_ID(T_ID_GEN,0)? И на сколько будете его увеличивать?

А если Вы работаете с базой не один? Очень возможно, что 2 пользователя одновременно получат одно и то же тек. значение генератора; дальше, думаю, понятно :)

А что касается "в той же транзакции", так генераторы работают вне контекста транзакций.

В общем, читайте:
http://ibase.ru/devinfo/generator.htm


YK   (2005-02-01 07:02:00) [22]

Всё-таки почему нельза использовать
GEN_ID(T_ID_GEN,0) , если я делаю это в той же транзакции?


Deniz   (2005-02-01 06:52:00) [23]

>YK ©   (31.01.05 16:50) [5]
>И ещё вопрос:
В MS-SQL есть очень удобная переменная @@identyty,
а в InterBase такого нет?

Нет и не надо.
Я щас какую-нибудь глупость скажу ... (с) (Гуру MSSQL поправьте)
В MSSQL нет объекта типа генератора(IB) или последовательности(Oracle), сл-но нет возможности получить уникальное значение ДО вставки записи. Используется алгоритм типа: вставил запись - запросил сгенерированное значение. Причем там есть какие-то подводные камни, когда это работает не совсем правильно.
В IB другой алгоритм: запросил новое значение - вставил с этим значением. Если значение не нужно для дальнейшего использования(массовая вставка), и в MSSQL и в IB просто не указываешь значение. В MSSQL сработает автоинкремент, а в IB триггер на условие if (NEW.ID is NULL) then ....
Учись думать по другому.


Desdechado   (2005-01-31 16:55:00) [24]

GEN_ID(T_ID_GEN,0) возвращает ТЕКУЩЕЕ значение генератора, но оно может быть НЕ ТВОЕ, а измененное другой транзакцией

2 msguns
почему ж не дает, очень даже дает.
Считай нужное значение генератора ДО, потом вставляй.


Sergey13   (2005-01-31 16:52:00) [25]

2[5] YK ©   (31.01.05 16:50)
Нет, ты не понял. Перечитай еще раз [2] и [4].


YK   (2005-01-31 16:50:00) [26]

Спасибо, но по-моему
следует сделать
не
select GEN_ID(T_ID_GEN,1) from rdb$database,
а select GEN_ID(T_ID_GEN,0) ...
т.к. Значение T_ID_GEN изменилось  триггером.

И ещё вопрос:
В MS-SQL есть очень удобная переменная @@identyty,
а в InterBase такого нет?


msguns   (2005-01-31 13:52:00) [27]

>Romkin ©   (31.01.05 12:07) [2]

Приведенная Вами схема не дает узнать значение ID ДО вставки.

>YK ©   (31.01.05 11:26)  
- Перед вставкой выполнить:
SELECT gen_id(<Имя генератора>,1) from rdb$Database
Возвращенный датасет содержит одну строку с одним полем, содержащим новоу значение идент-ра.

- Вставку делать с полученным значением


Romkin   (2005-01-31 12:08:00) [28]

http://ibase.ru/devinfo/generator.htm


Romkin   (2005-01-31 12:07:00) [29]

А как ты получаешь ID? В триггере?
Вот схема:

create table T (ID integer primary key);

create generator T_ID_GEN;

create trigger T_BI_GEN for T
active before insert
as
begin
 if (NEW.ID is NULL) then
   NEW.ID = GEN_ID(T_ID_GEN,1);
end;

Все, почти identity сделано :)
Почему почти? А если ты вставишь запись с пустым полем - оно занумеруется. А если значение в поле уже есть - оно так и вставится, генератор дергаться не будет.
Теперь остается только в приложении написать запрос
select GEN_ID(T_ID_GEN,1) from rdb$database
и получать очередной ID прямо там, и вставлять его в поле в обработчкие OnNewRecord или использовать где хочешь.
А по сути вопроса - узнать, какое значение вставил триггер: только перечитать запись.
Да, rdb$database - просто таблица с одной записью, всегда. Это не принципиально, просто IB не позволяет сделать select без from.


Sergey13   (2005-01-31 11:29:00) [30]

Лучше узнавать не "после", а "до того".
ibase.ru


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо