![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как узнать ID только что добавленной записе в InterBase [D6, IB6.x]
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