Delphi, Firebird, DB wapros...
3 отговора
105 прегледа
Delphi, Firebird, DB wapros...
Ситуацията е следната:
Имам делфи проложение, което вмъква или ъпдейтва записи в една таблица, нещо като ЛОГ... Таблицата има уникално поле ID. Понякога само вмъквам, но понякога ми се налага и да ъпдейтвам само определени полета.
Как най лесно и бързо да разбера, че това поле (ID), вече съществува, като засега имам два варианта:
1. if ExistsID(ID)
then Update
else Insert
2. Inset-vam и ако ми изкочи подобно Exception s MEssage 'violation of Primari or Unique...', тогава знам, че такъв запис съществува...
Първият метод не ми харесва, защото трябва да правя един селект в повече, а при вторият може и да се размина, но пък втория ми се вижда много , хм, груб с тези exception-i.
И т.к. не съм много навътре с БД, някой ако може да ме светне кой от двата начина е по-добър или да ми предложите трети :)
10х
Имам делфи проложение, което вмъква или ъпдейтва записи в една таблица, нещо като ЛОГ... Таблицата има уникално поле ID. Понякога само вмъквам, но понякога ми се налага и да ъпдейтвам само определени полета.
Как най лесно и бързо да разбера, че това поле (ID), вече съществува, като засега имам два варианта:
1. if ExistsID(ID)
then Update
else Insert
2. Inset-vam и ако ми изкочи подобно Exception s MEssage 'violation of Primari or Unique...', тогава знам, че такъв запис съществува...
Първият метод не ми харесва, защото трябва да правя един селект в повече, а при вторият може и да се размина, но пък втория ми се вижда много , хм, груб с тези exception-i.
И т.к. не съм много навътре с БД, някой ако може да ме светне кой от двата начина е по-добър или да ми предложите трети :)
10х
Re: Delphi, Firebird, DB wapros...
Не ми е много ясно какво имаш предвид под "да ъпдейтвам" при условие, че не знаеш дали този запис съществува, но ако съм те разбрал правилно аз бих ползвал stored procedura. Нещо такова:
Ако не те интересува дали е дoбавен или променен - не връщай резултата. Ако искаш да го направиш "по-така" ползвай курсор или rdb$db_key.
Ако не успееш, опитай пак. Ако пак не успееш спри да се правиш на глупак!
create procedure update_log(id integer, log_text varchar(100))
returns (insert_or_update char(1))
as
begin
if (exists(select 1 from log_table where id = :id)) then
begin
update log_table set log_text = :log_text where id = :id;
insert_or_update = 'U';
end
else
begin
insert into log_table(id, log_text) values(:id, :log_text);
insert_or_update = 'I';
end
suspend;
end
Ако не те интересува дали е дoбавен или променен - не връщай резултата. Ако искаш да го направиш "по-така" ползвай курсор или rdb$db_key.
Ако не успееш, опитай пак. Ако пак не успееш спри да се правиш на глупак!
Re: Delphi, Firebird, DB wapros...
Хех, много е готино това с процедурката... Горе-долу покрива вариант едно, но много по елегантно, мерси!!!
А този номер със select 1 form Update_Log е просто перфектен.
Пак мерси...


А този номер със select 1 form Update_Log е просто перфектен.
Пак мерси...
Re: Delphi, Firebird, DB wapros...
Като допълнение, ако ти е критична скоростта вж.Тесты вариантов реализации проверки существования записи при ее обновлении
