powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Узнать ID последней вставленной записи
23 сообщений из 23, страница 1 из 1
Узнать ID последней вставленной записи
    #34411144
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как узнать по выполнении INSETRа ID вставленной записи. ID - INT, генерируется триггером (а не через IDENTITY). Где-то ответ на это был, но, перерыв форм, нашел только для MSSQL.
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34411291
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1.
В каком триггере у генерируется id: в before или after?
2.
Как вы определяете "последнюю вставленную" запись?
По максимальному сгенерированному id?
Или как по-другому?
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34411427
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.
Before trigger на insert

2.
Лучше объяснить на (синтетическом) примере

таблица
Tab1
ID(MUNERIC) OTHER(VARCHAR 10)
----------------------------------
1 aaaaaaaa
2 bbbbbbbb

Я выполняю вставку
INSERT INTO tab1(OTHER)
VALUES ('cccccccc')

Мне требуется узнать, какое ID будет у вставленной записи.

Из-за триггера, если я выполню
INSERT INTO tab1(ID,OTHER)
VALUES (1,'cccccccc'),
то ID будет 3 (для указанного примера)
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34411518
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
select max(id)
from new table
(
INSERT INTO tab1(OTHER)
VALUES ('cccccccc')
);
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34411756
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишу в CBuilder 6, ADOCOnnection, ADOQuery. Выдает ошибки. На синтаксис. Увы, ищу дальше. Через то самое ...
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34411863
Фотография Alexey Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Должно работать.
То что CBuilder и ADO не имеет никакого значения.

ЗЫ ";" из запроса убрал?
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34413022
khl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein
Код: plaintext
1.
2.
3.
4.
5.
select max(id)
from new table
(
INSERT INTO tab1(OTHER)
VALUES ('cccccccc')
);

А если ID генерится через Identity - то же самое или есть еще какой способ узнать ID ??
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34413746
XEugene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein
Код: plaintext
1.
2.
3.
4.
5.
select max(id)
from new table
(
INSERT INTO tab1(OTHER)
VALUES ('cccccccc')
);
Неужели в DB2 нет функции для получения последнего вставленного идентификатора?
В MySQL например для этого есть функция LAST_INSERT_ID().
Такая необходимость ведь очень часто возникает.
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34413865
khl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вероятно, IDENTITY_VAL_LOCAL() - нашел в доках.
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34414144
khl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос к специалистам.

Делаю INSERT в таблицу.
СОММИТ.
Получаю ID последней записи.
Далее этот ID новой транзакцией вставляется в другие таблицы. И при неудаче второй транзакции первая уже не откатится. Фигня получается.

Как лучше получить новый ID до завершения транзакции?
Генерить в приложении?

Или в DB2 есть средства типа интербейзовских генераторов?

Или писать хранимую процедуру и держать последний ID в отдельной таблице? (подкиньте текст процедуры, если есть готовая)

Как кто поступает в таком случае?
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34414444
DB2Adventurer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE PROCEDURE newName ( IN p_name VARCHAR( 100 ), OUT p_lastid INTEGER )
    LANGUAGE SQL    SPECIFIC newName 
BEGIN ATOMIC
    INSERT INTO t_names    ( name)   VALUES   ( p_name) ;
    
    VALUES  identity_val_local()   INTO  p_lastid ;

    INSERT INTO t_users    ( last_id)   VALUES   ( p_lastid) ;
END
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34414703
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
khlВопрос к специалистам.

Делаю INSERT в таблицу.
СОММИТ.
Получаю ID последней записи.
Далее этот ID новой транзакцией вставляется в другие таблицы. И при неудаче второй транзакции первая уже не откатится. Фигня получается.
Правильно, что фигня. Сам же первую транзакию и закрыл. Всё надо было делать в одной транзакции.

khl
Как лучше получить новый ID до завершения транзакции?
В DB2 есть SEQUENCE (последовательности). Можно спросить следующий свободный номер у последовательности. В этом случае удасться избежать получения одного номера несколькими участниками.
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34414723
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ правильно предложил. Надо было делать SELECT из оператора INSERT. В этом случае Вы получаете набор ID только что созданных записей. При этом закрывать транзакцию совсем не надо. Триггеры и параметры, заполняемые по умолчанию, не ждут завершения транзакции.
Далее, в этой же транзакции работайте с полученным набором идентификаторов.
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34414724
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
khlКак лучше получить новый ID до завершения транзакции?Не завершать ее сразу после insert. :)
На самом деле, после того, как вы вставили запись в таблицу с полем generated ... as identity, это значение уже невозможно "откатить" вне зависимости от ваших дальнейших действий.
Если для вас это критично (частые rollback?), то используйте таблицу-счетчик, блокируя ее до завершения всей транзакции.
Только решите, стоит ли заметная потеря производительности того, или нет.
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34414866
khl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CREATE INTO и SEQUENCE, пожалуй решают все проблемы.

Сенкс.
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34423252
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey PopovДолжно работать.
То что CBuilder и ADO не имеет никакого значения.

ЗЫ ";" из запроса убрал?
Убрал. Та же Ж -вид сбоку...
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34423457
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BagaBagaУбрал. Та же Ж -вид сбоку...А команда db2level что у вас выдает?
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34424582
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DB21085I Instance "DB2" uses DB2 code release "SQL07010" with level identifier

"02010105" and informational tokens "DB2 v7.1.0", "n000510" and "".
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34424664
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну... ниче...ниче...
Бывает хуже )))...
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34424961
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BagaBagaDB21085I Instance "DB2" uses DB2 code release "SQL07010" with level identifier

"02010105" and informational tokens "DB2 v7.1.0", "n000510" and "".Тогда так действительно нельзя.
Остается использовать sequence или таблицу-счетчик.
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34426220
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinТогда так действительно нельзя.
Остается использовать sequence или таблицу-счетчик.
А из-за чего? Мне эта строка ничего не говорит. (Как-то запросы пришлось запускать с явным указанием уровня отимизиции[после обновления]. Может, и здесь что такое? ).
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34426260
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поля автогенерации generated ... as identity появились впервые в DB2 v7.2 for WIN. Значит остается вставлиять ID ручками. А вот откуда брать значение ID решай сам. Или через SEQUENCE, или сам веди таблицу последних использованных значений ID, или на худой конец select max(id).
В двух последних случаях придется разруливай блокировками и как следствие - жуткие тормоза при массовом асинхронном вводе.
...
Рейтинг: 0 / 0
Узнать ID последней вставленной записи
    #34426426
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BagaBagaА из-за чего? Мне эта строка ничего не говорит. (Как-то запросы пришлось запускать с явным указанием уровня отимизиции[после обновления]. Может, и здесь что такое? ).У вас слишком старая версия db2.
Так, как я написал (select ... from new table...), можно только, начиная с v8.1.4.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Узнать ID последней вставленной записи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]