Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.066 c
15-1138765315
12DFBDD
2006-02-01 06:41
2006.02.19
Поисковики vs IBM


15-1138449645
Хинт
2006-01-28 15:00
2006.02.19
Дурацкий вопрос


2-1138766232
mss
2006-02-01 06:57
2006.02.19
Как сделать


15-1138300689
Sergey Masloff
2006-01-26 21:38
2006.02.19
Новое это хорошо забытое старое. "Новинки" книжного рынка


2-1139063422
user2
2006-02-04 17:30
2006.02.19
Запрос





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский