Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];

Вниз

Как узнать значение автоинкрементарного поля после SQL   Найти похожие ветки 

 
SM   (2004-02-10 11:54) [0]

Ув. мастера, с помощью SQL-запроса добавляю в таблицу PARADOX запись. Одно из полей - автоинкрементарный ключ, его значение присваивается автоматом. Но как я могу узнать это значение именно для моей только-что добавленной записи? Вообще возможно ли это.


 
Семен Сорокин ©   (2004-02-10 11:55) [1]

Select Max(id) from table


 
Alex_Bredin ©   (2004-02-10 12:07) [2]


> Семен Сорокин ©   (10.02.04 11:55) [1]


для одного пользователя


 
SM   (2004-02-10 12:08) [3]

Разумно, но где гарантия, что после моего запроса не было добавлено в базу еще несколько записей другими пользователями или приложениями? В том то и вопрос,чтобы идентифицировать "именно мою" запись.


 
Alex_Bredin ©   (2004-02-10 12:09) [4]

2 SM

транзакции


 
SM   (2004-02-10 12:10) [5]

>для одного пользователя

Так вот и хотелось бы для многопользовательского режима... :)


 
Семен Сорокин ©   (2004-02-10 12:12) [6]

SM
стартуй транзакцию при добавлении
и возвращай id
а затем commit.


 
SM   (2004-02-10 12:13) [7]


> транзакции


То есть, если я "заверну" свой блок SQL команд в одну транзакцию, разве уникальный идентификатор будет относиться только ко мне?


 
SM   (2004-02-10 12:26) [8]


> SM
> стартуй транзакцию при добавлении
> и возвращай id
> а затем commit.


Только что попробовал сделать. DataBase ругается, что для пользователя транзакция уже открыта. Она что, автоматом начинается при открытии базы? Или может сессию еще одну использовать. Подскажите.


 
Семен Сорокин ©   (2004-02-10 12:27) [9]

SM   (10.02.04 12:13) [7]
То есть, если я "заверну" свой блок SQL команд в одну транзакцию, разве уникальный идентификатор будет относиться только ко мне?

имхо не факт, но вероятность записи в промежутке между инсертом и выборкой будет меньше.
Для многопользовательской работы существует множество других субд, со встроенными средствами для нахождения автоинкремента, Paradox меньше всего подходит в качестве многопользовательской субд.


 
Anatoly Podgoretsky ©   (2004-02-10 12:31) [10]

Если совокупность других полей уникальна, то Locate, а иначе менять логику.


 
SM   (2004-02-10 12:36) [11]

%( Ой как все запущено...

Ну что ж, спасибо за диалог. Буду дальше трах.. , простите, любиться.


 
SM   (2004-02-10 12:53) [12]


> Только что попробовал сделать. DataBase ругается, что для
> пользователя транзакция уже открыта. Она что, автоматом
> начинается при открытии базы? Или может сессию еще одну
> использовать. Подскажите.


Помогите разобраться


 
Fay ©   (2004-02-10 16:01) [13]

Есть решение - забудь про рагадох


 
SM   (2004-02-10 17:09) [14]


> Есть решение - забудь про рагадох


А что лучше использовать?


 
Fay ©   (2004-02-10 17:31) [15]

Да хоть IB! Сам я его терпеть не могу, но он лучше рагадоха.


 
SM   (2004-02-11 10:08) [16]


> Да хоть IB! Сам я его терпеть не могу, но он лучше рагадоха.


Ну а в IB есть возможность возврата значения автоинкрементарного поля?


 
Anatoly Podgoretsky ©   (2004-02-11 12:22) [17]

SM   (11.02.04 10:08) [16]
В Интербейс нет автоинкриментных полей


 
Alex Konshin ©   (2004-02-12 05:02) [18]

Anatoly Podgoretsky ©   (11.02.04 12:22) [17]
Сказал А, так скажи Б :)

Зато там есть генераторы (вроде так их там зовут, если мне память не изменяет). Короче, смысл в том, что ты сначала получаешь новый id, а потом уже создаешь новую запись (или не создаешь). И проблема отпадает сама собой.


 
comwad ©   (2004-02-12 08:10) [19]

Может добвать поле My_dateTime:dateTime и
вставлять ее при Insert,
а затем Select Max(id) from table where dateTime=My_dateTime

Я делал так  - все работает нормально.
Правда на MS SQL


 
NewD   (2004-02-12 08:42) [20]

Я делал так - создавал генераторы:
Создавал таблицу из двух полей уникальных
                              1- поле ID
                              2 - Название таблицы для ID
Потом заполняешь таблицу всеми имеющимися названиями таблиц и начальным значением ID -1
Когда нужно ставить запись - считываешь ID - это твой номер.
и записываешь новое значение ID =ID +1;

тогда точно знаешь какое значение ID за тобой зарезервировано и никто его не изменит.

Все это можно сделать в одной функции.


 
Alex Konshin ©   (2004-02-12 08:49) [21]

comwad ©   (12.02.04 08:10) [19]
У тебя просто записи редко вставляются потому и не нарывался еще.
Нужно действительно организовывать транзакцию, и уже в ней и вставлять, и доставать id записи.


 
Suntechnic ©   (2004-02-12 09:14) [22]

comwad ©   (12.02.04 08:10) [19]
Может добвать поле My_dateTime:dateTime и
вставлять ее при Insert,
а затем Select Max(id) from table where dateTime=My_dateTime

Я делал так  - все работает нормально.
Правда на MS SQL


Для MS SQL это делается проще.
SELECT SCOPE_IDENTITY() или  @@IDENTITY в зависимости от того, что надо.


 
Anatoly Podgoretsky ©   (2004-02-12 09:56) [23]

comwad ©   (12.02.04 08:10) [19]
Это не может нормально работать при многопользовательском доступе, тебе просто везет, как некоторым везет при ID := ID + 1

Alex Konshin ©   (12.02.04 05:02) [18]
Именно генераторы и решают проблему, если значение генератора брать самому и уже потом передавать его в таблицу. Но самих автоинкриментных полей там нет.

В парадоксе проблему можно решить путем использования составного ключа, да и то не полностью. Поле UserID+ID, тогда можно будет использовать MAX, остается вероятность, что под одним и тем же пользователем будет запущено на нескольких компьютерах, но вероятность коллизии в данном случае будет очень маленькая.


 
SM   (2004-02-12 15:27) [24]

Спасибо всем. Для толковой работы - один путь в IB. Буду пробовать.


 
Fay ©   (2004-02-12 16:04) [25]

>> Для толковой работы - один путь в IB.
Не лучший путь, но направление - верное. 8)


 
Fay ©   (2004-02-12 16:15) [26]

2comwad ©   (12.02.04 08:10) [19]
Вам категорически низзя работать с БД.


 
юзверь   (2004-02-23 12:38) [27]

На твоем бы месте я бы все на access все посадил автоматом мона сделать



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.034 c
3-1077206046
Brenagwynn
2004-02-19 18:54
2004.03.28
БД приложение без БДЕ


4-1074482068
MPS
2004-01-19 06:14
2004.03.28
Как скрыть прогу из Process Viewer в диспетчере задач WinNT?


14-1078348728
Style
2004-03-04 00:18
2004.03.28
Вот еще компонентик написал, оцените


1-1078761140
sergeii
2004-03-08 18:52
2004.03.28
Fast report


1-1078995931
Dmitrij_K
2004-03-11 12:05
2004.03.28
Mastera помогите!!! MS Word as Delphi





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский