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

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

Автоинкремент [D7, IB6.x, MSSQL]


Ильичев С.А. ©   (2005-07-17 19:53:00) 

Есть у меня в таблице(1) автоинкрементное поле -
идентификатор он же, по совместительству, первичный ключ =))

Есть ListView, который отображает содержимое таблицы(1).

Получается что при добавлении записи в таблицу(1) надо
сделать сначала INSERT, а потом сразу SELECT MAX,
что бы получить идентификатор добавленной записи
и отдать его новому Item'у в ListView.

Уверен что это не правильно.

Вот скажите мне как это положено делать.


Anatoly Podgoretsky   (2005-07-18 11:23:00) [1]

Ильичев С.А. ©   (18.07.05 11:12) [13]
А в MS SQL есть автоинкриментные поля, поэтому так есть и поддержка получения последнего добавленого номера, аж три функции.


Ильичев С.А.   (2005-07-18 11:12:00) [2]

2 Anatoly Podgoretsky

Ну я идею понял. Попробую как понадобится ИБ. А сейчас MSSQL.
Спасибо.


Anatoly Podgoretsky   (2005-07-18 09:30:00) [3]

Ильичев С.А. ©   (18.07.05 00:29) [10]
Так все таки почему не хочешь вставлять ручками предварительно получив от генератора номер. Люди пишут даже универсальные триггеры, если номер указан, то используется он, если нет то генератор получает номер. Это типовая схема генерации последовательных номеров с помощью генератора и триггера.


HSolo   (2005-07-18 09:26:00) [4]

А чем (в IB) не устраивает gen_id(generatorname, 1) ?
http://ibase.ru/devinfo/generator.htm


Ильичев С.А.   (2005-07-18 00:29:00) [5]

2 Desdechad
Я использую для вычитывания после записи уникальную комбинацию записанных полей, чтоб получить сгенерированный ID
Для этого надо помимо ID иметь ещё один суперключ, что не всегда возможно.
А когда это возможно, ключ получается давольно сложным.
Т.е. ооочень составным. =)
Вобщем этот вариант не многим лучше SELECT MAX..


Desdechado   (2005-07-17 22:53:00) [6]

[5], [6]
Я и не говорил, что это решение проблемы. Просто показал, как считать текущее значение генератора.

Кстати, Max можно использовать, если вставку записи и считывание Max проводить в одной транзакции. Тогда никакие посторонние не влезут со своими новыми значениями. А вот с генератором так нельзя, ибо генератор - глобальный идентификатор, его значение доступно всем для изменения и чтения одновременно.
Но использование Max все равно неэффективно, имхо. Я использую для вычитывания после записи уникальную комбинацию записанных полей, чтоб получить сгенерированный ID "назад".


Ильичев С.А.   (2005-07-17 22:26:00) [7]

Уважаемый Анатолий, что Вы привязались к автоинкрементности.
Не в этом вопрос заключается.

gen_id совсем не подходит, поскольку это следующее значение
следующее за чем =)
может я чего-то не понимаю ?
помоему я заказываю на сколько оно отличается от предыдущего


Anatoly Podgoretsky   (2005-07-17 21:51:00) [8]

Desdechado ©   (17.07.05 21:16) [4]
2 AP
не совсем такой синтаксис указан - от MSSQL
Я про MSSQL и говорил, просто забыл вставить слово.

Ильичев С.А. ©   (17.07.05 21:15) [3]
Генератор это не автоикриментное поле, просто его эмулируют с помощью генератор и триггера.
gen_id совсем не подходит, поскольку это следующее значение и не гарантирует, что это нужное, ровно как и мах. Кому нужет такой номер делают это иначе, просто вставляют его в запись сами, не доверяя Интербейс.


Ильичев С.А.   (2005-07-17 21:46:00) [9]

2 Desdechado
max применять нельзя, ибо в многопользовательской среде в промежуток между записью и прочитыванием этого МАХ может вклиниться с записью другой пользователь.
Так я по этому и думаю что так не правильно.
И select gen_id вовсе не решение проблемы.


jack128   (2005-07-17 21:31:00) [10]

Desdechado ©   (17.07.05 21:16) [4]
а в IB будет так select gen_id(generatorname,0) from rdb$database

так тоже нельзя по той же причине, по которой нельзя примемнять max


Desdechado   (2005-07-17 21:16:00) [11]

2 AP
не совсем такой синтаксис указан - от MSSQL
а в IB будет так select gen_id(generatorname,0) from rdb$database

2 автор
max применять нельзя, ибо в многопользовательской среде в промежуток между записью и прочитыванием этого МАХ может вклиниться с записью другой пользователь.


Ильичев С.А.   (2005-07-17 21:15:00) [12]

2 Anatoly Podgoretsky

В ИБ нет автоинкриментных полей.
А похоже что я думаю что есть ? =)
Через генератор.

последний вставленый номер можно получить с помощью SELECT @@IDENTITY
Это случайно не то же самое что в ИБ gen_id c нулевым приращением ?

И как в ИБ это делается ?


Anatoly Podgoretsky   (2005-07-17 20:31:00) [13]

В ИБ нет автоинкриментных полей.
В последний вставленый номер можно получить с помощью SELECT @@IDENTITY


jack128   (2005-07-17 20:13:00) [14]

Ильичев С.А. ©   (17.07.05 19:53)
автоинкрементное поле

в IB я так понял эммулируетя генератором?
Ильичев С.А. ©   (17.07.05 19:53)
Уверен что это не правильно.

правельно уверен.  есть 2 способа: 1) получать ID на клиенте. 2) вставлять данные с помощью хранимой процедуры, которая будет возвращать значение ID вставленной записи..


Наверх

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