Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.038 c
1-1123670582
ANB
2005-08-10 14:43
2005.08.28
Как избавится от порчи большого текста в TRichEdit


10-1080215297
Max_Fin
2004-03-25 14:48
2005.08.28
DCOM и LPSTR


3-1121348982
Uran
2005-07-14 17:49
2005.08.28
Номер недели в ADO


5-1093642947
Sphinx
2004-08-28 01:42
2005.08.28
Перекрытие свойств компонента


14-1123172076
Gerakl
2005-08-04 20:14
2005.08.28
Delphi2005





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский