Portál AbcLinuxu, 20. srpna 2025 18:48


Dotaz: Ako nevložiť záznam pri splnení podmienky

11.9.2020 10:24 jozef
Ako nevložiť záznam pri splnení podmienky
Přečteno: 2494×
Odpovědět | Admin
Ako najjednoduchšie nevložiť záznam do tabuľky, ak je splnená určitá podmienka?

Chcem vložiť riadok, kde sú pre mňa podstatné dve hodnoty/stĺpce A a B.

Ak pre vkladanú hodnotu A platí (A > 1000), tak skontroluj, či už v tabuľke existuje hodnota B.

Ak podmienka platí, tak záznam sa nevloží.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

11.9.2020 10:35 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Ako nevložiť záznam pri splnení podmienky
Odpovědět | | Sbalit | Link | Blokovat | Admin
Conditional insert
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Gréta avatar 11.9.2020 15:27 Gréta | skóre: 37 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: Ako nevložiť záznam pri splnení podmienky
Odpovědět | | Sbalit | Link | Blokovat | Admin

by taky jakoby bylo dobrý říct jakej druh databáze to je :O ;D

nóó takže ten if A>1000 bych jako nedělala v tom sql ale vtom z čeho to sql jakoby voláš a na základě tý podmínky vždycky udělala buťto vobyč insert když by bylo A menší/rovno tý tisícovky noa jinak druhý sql coby koukalo jestli už existuje hodnota B takle nějak

 INSERT INTO Tabulka(sloupec_A, sloupec_B)
 SELECT hodnota_A, hodnota_B
 WHERE not EXISTS( SELECT * FROM Tabulka WHERE sloupec_B = hodnota_B)

hodnota_a a hodnota_b sou tvý proměný ;D

joa neni náhodou ta hodnota b ždycky unikátní???? :O ;D by ji jako šlo udělat unikátním indexem taky pak hele :O ;D

Zelená energetická soustava založená na obnovitelnejch zdrojích energie versus realnej svět 🤡🇪🇸
11.9.2020 19:53 okbobcz | skóre: 8
Rozbalit Rozbalit vše Re: Ako nevložiť záznam pri splnení podmienky
Bacha na race condition - u multiuživatelských databází by si člověk měl vždy položit otázku "co se stane (nebo se má stát), když se o totéž pokusí dva nebo více uživatelů?".
Josef Kufner avatar 15.9.2020 19:31 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Ako nevložiť záznam pri splnení podmienky
Pokud je na sloupci B unikátní klíč, tak jde použít INSERT IGNORE.
Hello world ! Segmentation fault (core dumped)
Josef Kufner avatar 15.9.2020 14:04 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Ako nevložiť záznam pri splnení podmienky
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jednoduché řešení je ten SQL dotaz na vkládání prostě nespouštět. Tedy tu podmínku nechat v aplikaci.
Hello world ! Segmentation fault (core dumped)
15.9.2020 15:30 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Ako nevložiť záznam pri splnení podmienky
To by byl jeden zbytečný dotaz navíc a bylo by riziko souběhu.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Josef Kufner avatar 15.9.2020 19:30 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Ako nevložiť záznam pri splnení podmienky
Záleží na aplikaci, nástrojích a zda ta data už v aplikační vrstvě máš. Ale může to tak být.
Hello world ! Segmentation fault (core dumped)
15.9.2020 19:13 oslíček jara
Rozbalit Rozbalit vše Re: Ako nevložiť záznam pri splnení podmienky
Odpovědět | | Sbalit | Link | Blokovat | Admin
table ale1000

table agt1000, unique B

view V ale1000 union all agt1000
trigger on V instead of insert
if a<=1000
insert into ale1000
else
insert into agt1000
end
insert into V(a,b)(42,2); // ok
insert into V(a,b)(666,2); // ok
insert into V(a,b)(1042,2); // ok
insert into V(a,b)(1666,2); // err
17.9.2020 15:15 Ivan
Rozbalit Rozbalit vše Re: Ako nevložiť záznam pri splnení podmienky
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tohle aplikace nema sanci zkontrolovat.

Tohle muze kontrolovat trigger "BEFORE INSERT". Pokud tvuj DB engine neco podobneho podporuje.

Otazka je co se ma stat, kdyz nekdo tu hodnotu B smaze. Jsou ta data pak konzistentni?

Neco podobneho by bylo tezke implementovat i v Oracle, nejspis by to skoncilo "ORA-04091 table is mutating, trigger/function may not see it". Ten tvuj problem je jednoduse popsany, ale ve vice-uzivatelskem prostredi, kde probihaji transakce to muze byt dost slozite.
Josef Kufner avatar 17.9.2020 18:47 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Ako nevložiť záznam pri splnení podmienky
K tomu jsou transakce a zámky.
Hello world ! Segmentation fault (core dumped)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.