![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать значение автоинкрементарного поля после SQL [D6, Paradox]
SM © (2004-02-10 11:54:00)Ув. мастера, с помощью SQL-запроса добавляю в таблицу PARADOX запись. Одно из полей - автоинкрементарный ключ, его значение присваивается автоматом. Но как я могу узнать это значение именно для моей только-что добавленной записи? Вообще возможно ли это.
юзверь (2004-02-23 12:38:00) [1]На твоем бы месте я бы все на access все посадил автоматом мона сделать
Fay (2004-02-12 16:15:00) [2]2comwad © (12.02.04 08:10) [19]
Вам категорически низзя работать с БД.
Fay (2004-02-12 16:04:00) [3]>> Для толковой работы - один путь в IB.
Не лучший путь, но направление - верное. 8)
SM (2004-02-12 15:27:00) [4]Спасибо всем. Для толковой работы - один путь в IB. Буду пробовать.
Anatoly Podgoretsky (2004-02-12 09:56:00) [5]comwad © (12.02.04 08:10) [19]
Это не может нормально работать при многопользовательском доступе, тебе просто везет, как некоторым везет при ID := ID + 1
Alex Konshin © (12.02.04 05:02) [18]
Именно генераторы и решают проблему, если значение генератора брать самому и уже потом передавать его в таблицу. Но самих автоинкриментных полей там нет.
В парадоксе проблему можно решить путем использования составного ключа, да и то не полностью. Поле UserID+ID, тогда можно будет использовать MAX, остается вероятность, что под одним и тем же пользователем будет запущено на нескольких компьютерах, но вероятность коллизии в данном случае будет очень маленькая.
Suntechnic (2004-02-12 09:14:00) [6]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в зависимости от того, что надо.
Alex Konshin (2004-02-12 08:49:00) [7]comwad © (12.02.04 08:10) [19]
У тебя просто записи редко вставляются потому и не нарывался еще.
Нужно действительно организовывать транзакцию, и уже в ней и вставлять, и доставать id записи.
NewD (2004-02-12 08:42:00) [8]Я делал так - создавал генераторы:
Создавал таблицу из двух полей уникальных
1- поле ID
2 - Название таблицы для ID
Потом заполняешь таблицу всеми имеющимися названиями таблиц и начальным значением ID -1
Когда нужно ставить запись - считываешь ID - это твой номер.
и записываешь новое значение ID =ID +1;
тогда точно знаешь какое значение ID за тобой зарезервировано и никто его не изменит.
Все это можно сделать в одной функции.
comwad (2004-02-12 08:10:00) [9]Может добвать поле My_dateTime:dateTime и
вставлять ее при Insert,
а затем Select Max(id) from table where dateTime=My_dateTime
Я делал так - все работает нормально.
Правда на MS SQL
Alex Konshin (2004-02-12 05:02:00) [10]Anatoly Podgoretsky © (11.02.04 12:22) [17]
Сказал А, так скажи Б :)
Зато там есть генераторы (вроде так их там зовут, если мне память не изменяет). Короче, смысл в том, что ты сначала получаешь новый id, а потом уже создаешь новую запись (или не создаешь). И проблема отпадает сама собой.
Anatoly Podgoretsky (2004-02-11 12:22:00) [11]SM (11.02.04 10:08) [16]
В Интербейс нет автоинкриментных полей
SM (2004-02-11 10:08:00) [12]
> Да хоть IB! Сам я его терпеть не могу, но он лучше рагадоха.
Ну а в IB есть возможность возврата значения автоинкрементарного поля?
Fay (2004-02-10 17:31:00) [13]Да хоть IB! Сам я его терпеть не могу, но он лучше рагадоха.
SM (2004-02-10 17:09:00) [14]
> Есть решение - забудь про рагадох
А что лучше использовать?
Fay (2004-02-10 16:01:00) [15]Есть решение - забудь про рагадох
SM (2004-02-10 12:53:00) [16]
> Только что попробовал сделать. DataBase ругается, что для
> пользователя транзакция уже открыта. Она что, автоматом
> начинается при открытии базы? Или может сессию еще одну
> использовать. Подскажите.
Помогите разобраться
SM (2004-02-10 12:36:00) [17]%( Ой как все запущено...
Ну что ж, спасибо за диалог. Буду дальше трах.. , простите, любиться.
Anatoly Podgoretsky (2004-02-10 12:31:00) [18]Если совокупность других полей уникальна, то Locate, а иначе менять логику.
Семен Сорокин (2004-02-10 12:27:00) [19]SM (10.02.04 12:13) [7]
То есть, если я "заверну" свой блок SQL команд в одну транзакцию, разве уникальный идентификатор будет относиться только ко мне?
имхо не факт, но вероятность записи в промежутке между инсертом и выборкой будет меньше.
Для многопользовательской работы существует множество других субд, со встроенными средствами для нахождения автоинкремента, Paradox меньше всего подходит в качестве многопользовательской субд.
SM (2004-02-10 12:26:00) [20]
> SM
> стартуй транзакцию при добавлении
> и возвращай id
> а затем commit.
Только что попробовал сделать. DataBase ругается, что для пользователя транзакция уже открыта. Она что, автоматом начинается при открытии базы? Или может сессию еще одну использовать. Подскажите.