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