Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.28;
Скачать: CL | DM;

Вниз

Как узнать значение автоинкрементарного поля после 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.022 c
1-1078979039
Andrey V.
2004-03-11 07:23
2004.03.28
Автопереход на следующий объект


14-1078144274
Andersen
2004-03-01 15:31
2004.03.28
Кто в кошку от кота отличить сможет?


1-1077896458
Гиричев Руслан
2004-02-27 18:40
2004.03.28
Перемещение в TreeView


3-1078086419
Sesh
2004-02-29 23:26
2004.03.28
Progress Bar & ADOStoredProc


1-1078416763
AlexLine
2004-03-04 19:12
2004.03.28
Загрузка изображиний в TImage