Форум: "Базы";
Текущий архив: 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