Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать значение автоинкрементарного поля после SQL [D6, Paradox]


Страницы:   1 2

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 ругается, что для пользователя транзакция уже открыта. Она что, автоматом начинается при открытии базы? Или может сессию еще одну использовать. Подскажите.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо