Форум: "Базы";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
ВнизЗначения AutoInc поля только что введенной записи Найти похожие ветки
← →
Barsky © (2005-12-22 17:20) [0]Есть табличка на 2 поля
F1 (AutoInc)
F2 (A255)
Делаем:query.sql.text:="INSERT INTO моя_табличка (F2) VALUES ("123")";
query.execsql
В F1 автоматически записывается значение. Как его узнать?
← →
msguns © (2005-12-22 17:43) [1]Select max(F1) from моя_табличка
← →
Barsky © (2005-12-22 17:53) [2]А если между этими запросами кто-то еще добавил запись?
Тогда так не получится.
← →
sniknik © (2005-12-22 17:56) [3]Barsky © (22.12.05 17:53) [2]
парадокс! ;)
← →
Barsky © (2005-12-22 18:00) [4]
> sniknik © (22.12.05 17:56) [3]
=))))))
Тоесть в данном случае без хитрых вывертов с ведением логов активности юзеров не выкрутиться? =)
← →
Slym © (2005-12-23 07:22) [5]Открывать курсор
← →
ЮЮ © (2005-12-23 08:08) [6]отказаться от автоинкремента, генерировать его на клиенте (тот же MAX), обернув вставку в try ... exept таким, чтобы увернуться от попытки вставить запись с существующим значением F1.
З.Ы. Ну что это за имена полей F1, F2 ?
← →
Виталий Панасенко (2005-12-23 09:24) [7]Использовать TTable
← →
Sergey13 © (2005-12-23 09:35) [8][6] ЮЮ © (23.12.05 08:08)
>отказаться от автоинкремента
ИМХО, лучше сразу от Парадокса. Тем более много народу работает (много - это >1 8-).
← →
Barsky © (2005-12-23 09:37) [9]
> Slym © (23.12.05 07:22) [5]
> Открывать курсор
Что это?
ЮЮ © (23.12.05 08:08) [6]
> З.Ы. Ну что это за имена полей F1, F2 ?
Это не фрагмент, а пример кода =)
← →
ЮЮ © (2005-12-23 09:50) [10]Ну и ещё как вариант, не требующий никаких переделок :
query.sql.text:="INSERT INTO моя_табличка (F2) VALUES ("123")";
query.execsql;
query.sql.text:=SELECT F1 FROM моя_табличка WHERE F2="123"";
query.Open;
Даже если при этом прихватишь не "свою" запись, какая разница, она же идентична той, что ввел ты :)
← →
ANB © (2005-12-23 10:42) [11]
> Barsky © (22.12.05 17:53) [2]
> А если между этими запросами кто-то еще добавил запись?
> Тогда так не получится.
На время этих двух запросов блокировать таблицу. Будет медленнее, но надежнее.
← →
Barsky © (2005-12-23 10:45) [12]
> ЮЮ © (23.12.05 09:50) [10]
Поле F2 не уникальное, и есть вариант что запостят 2 записи с одинаковым значением этого поля. Тогда облом.
Вероятность минимальная, но всякое может случиться. Так что не катит =)
← →
Sergey13 © (2005-12-23 10:52) [13]2 [12] Barsky © (23.12.05 10:45)
Против этого "облома" существует MAX.
← →
Barsky © (2005-12-23 11:19) [14]
> Sergey13 © (23.12.05 10:52) [13]
И как он поможет?
2All: Кароче задача без выкрутасов не решается =)
← →
Sergey13 © (2005-12-23 11:23) [15]2[14] Barsky © (23.12.05 11:19)
>И как он поможет?
Да как всегда.query.sql.text:=SELECT MAX(F1) FROM моя_табличка WHERE F2="123"";
← →
sniknik © (2005-12-23 11:33) [16]> Поле F2 не уникальное, и есть вариант что запостят 2 записи с одинаковым значением этого поля. Тогда облом.
используй уникальное, и только для идентификации записи, после меняеш на рабочее значение.
var
Guid: TGUID
stGuid: string;
begin
CreateGUID(Guid);
stGuid:= GUIDToString(Guid)
query.sql.text:="INSERT INTO моя_табличка (F2) VALUES (""+stGuid+"")";
query.execsql;
query.sql.text:=SELECT F1 FROM моя_табличка WHERE F2=""+stGuid+""";
query.Open;
//получили однозначный, теперь апдейт и вся работа с записью через ключевое поле
....
тормозно зато с гарантией. тормоза тоже немного можно "остимизировать" (убрать), например считывать перед инсертом максимальный инкремент и в выборке на получение (второй запрос) использовать двойное условие > сохраненного и = stGuid (чтобы не было полного перебора по скорей всего неиндексируемому полю)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.056 c