Форум: "Базы";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
ВнизАвтоинкремент Найти похожие ветки
← →
Ильичев С.А. © (2005-07-17 19:53) [0]Есть у меня в таблице(1) автоинкрементное поле -
идентификатор он же, по совместительству, первичный ключ =))
Есть ListView, который отображает содержимое таблицы(1).
Получается что при добавлении записи в таблицу(1) надо
сделать сначала INSERT, а потом сразу SELECT MAX,
что бы получить идентификатор добавленной записи
и отдать его новому Item"у в ListView.
Уверен что это не правильно.
Вот скажите мне как это положено делать.
← →
jack128 © (2005-07-17 20:13) [1]Ильичев С.А. © (17.07.05 19:53)
автоинкрементное поле
в IB я так понял эммулируетя генератором?
Ильичев С.А. © (17.07.05 19:53)
Уверен что это не правильно.
правельно уверен. есть 2 способа: 1) получать ID на клиенте. 2) вставлять данные с помощью хранимой процедуры, которая будет возвращать значение ID вставленной записи..
← →
Anatoly Podgoretsky © (2005-07-17 20:31) [2]В ИБ нет автоинкриментных полей.
В последний вставленый номер можно получить с помощью SELECT @@IDENTITY
← →
Ильичев С.А. © (2005-07-17 21:15) [3]2 Anatoly Podgoretsky
В ИБ нет автоинкриментных полей.
А похоже что я думаю что есть ? =)
Через генератор.
последний вставленый номер можно получить с помощью SELECT @@IDENTITY
Это случайно не то же самое что в ИБ gen_id c нулевым приращением ?
И как в ИБ это делается ?
← →
Desdechado © (2005-07-17 21:16) [4]2 AP
не совсем такой синтаксис указан - от MSSQL
а в IB будет так select gen_id(generatorname,0) from rdb$database
2 автор
max применять нельзя, ибо в многопользовательской среде в промежуток между записью и прочитыванием этого МАХ может вклиниться с записью другой пользователь.
← →
jack128 © (2005-07-17 21:31) [5]Desdechado © (17.07.05 21:16) [4]
а в IB будет так select gen_id(generatorname,0) from rdb$database
так тоже нельзя по той же причине, по которой нельзя примемнять max
← →
Ильичев С.А. © (2005-07-17 21:46) [6]2 Desdechado
max применять нельзя, ибо в многопользовательской среде в промежуток между записью и прочитыванием этого МАХ может вклиниться с записью другой пользователь.
Так я по этому и думаю что так не правильно.
И select gen_id вовсе не решение проблемы.
← →
Anatoly Podgoretsky © (2005-07-17 21:51) [7]Desdechado © (17.07.05 21:16) [4]
2 AP
не совсем такой синтаксис указан - от MSSQL
Я про MSSQL и говорил, просто забыл вставить слово.
Ильичев С.А. © (17.07.05 21:15) [3]
Генератор это не автоикриментное поле, просто его эмулируют с помощью генератор и триггера.
gen_id совсем не подходит, поскольку это следующее значение и не гарантирует, что это нужное, ровно как и мах. Кому нужет такой номер делают это иначе, просто вставляют его в запись сами, не доверяя Интербейс.
← →
Ильичев С.А. © (2005-07-17 22:26) [8]Уважаемый Анатолий, что Вы привязались к автоинкрементности.
Не в этом вопрос заключается.
gen_id совсем не подходит, поскольку это следующее значение
следующее за чем =)
может я чего-то не понимаю ?
помоему я заказываю на сколько оно отличается от предыдущего
← →
Desdechado © (2005-07-17 22:53) [9][5], [6]
Я и не говорил, что это решение проблемы. Просто показал, как считать текущее значение генератора.
Кстати, Max можно использовать, если вставку записи и считывание Max проводить в одной транзакции. Тогда никакие посторонние не влезут со своими новыми значениями. А вот с генератором так нельзя, ибо генератор - глобальный идентификатор, его значение доступно всем для изменения и чтения одновременно.
Но использование Max все равно неэффективно, имхо. Я использую для вычитывания после записи уникальную комбинацию записанных полей, чтоб получить сгенерированный ID "назад".
← →
Ильичев С.А. © (2005-07-18 00:29) [10]2 Desdechad
Я использую для вычитывания после записи уникальную комбинацию записанных полей, чтоб получить сгенерированный ID
Для этого надо помимо ID иметь ещё один суперключ, что не всегда возможно.
А когда это возможно, ключ получается давольно сложным.
Т.е. ооочень составным. =)
Вобщем этот вариант не многим лучше SELECT MAX..
← →
HSolo © (2005-07-18 09:26) [11]А чем (в IB) не устраивает gen_id(generatorname, 1) ?
http://ibase.ru/devinfo/generator.htm
← →
Anatoly Podgoretsky © (2005-07-18 09:30) [12]Ильичев С.А. © (18.07.05 00:29) [10]
Так все таки почему не хочешь вставлять ручками предварительно получив от генератора номер. Люди пишут даже универсальные триггеры, если номер указан, то используется он, если нет то генератор получает номер. Это типовая схема генерации последовательных номеров с помощью генератора и триггера.
← →
Ильичев С.А. © (2005-07-18 11:12) [13]2 Anatoly Podgoretsky
Ну я идею понял. Попробую как понадобится ИБ. А сейчас MSSQL.
Спасибо.
← →
Anatoly Podgoretsky © (2005-07-18 11:23) [14]Ильичев С.А. © (18.07.05 11:12) [13]
А в MS SQL есть автоинкриментные поля, поэтому так есть и поддержка получения последнего добавленого номера, аж три функции.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.037 c