[ nnn @ 06.06.2010. 14:29 ] @
Potrebno mi je u jednom upitu da uradim select, a ako podatak ne postoji, dodati ga.
Imam tabelu user(ID,Name,Points)
i sad potrebno je da u jednom upitu uradim
SELECT points FROM user WHERE name = 'xxx' Sad ako nema usera xxx da
INSERT INTO user('xxx',1500)

i da mi upit vrati 1500 ili ako je vec postojao, vratim poene koje ima.


Jel moguce ovako nesto uraditi i kako?

Hvala
[ Nikola Poša @ 06.06.2010. 16:36 ] @
A zar nije bolje da to rešiš u domain logici? Najpre odradiš taj select, pa ako ima potrebe za insert-om - odradiš ga, u suprotnom, imaš rezultat tog upita.
[ bogdan.kecman @ 06.06.2010. 16:51 ] @
tako kako si napisao - ne moze

ono sto moze je (pod uslovom da je `name` UNIQUE kljuc - inace ne moze)

Code:

insert IGNORE into `user` (name, points) values ('xxx', 1500);
select points from `user` where name = 'xxx';


prvi ce da insertuje usera ako ne postoji, drugi ce da ti vrati vrednost. problem je sto to radi samo ako je `name` polje unique pa ne mozes da imas dva coveka sa istim imenom u bazi (sto uglavnom nije tacno!!!) tako da se bojim da ces morati neko inteligentnije resenje (npr ovo sto ti je nikola rekao, uradi select pa ako dobijes "nema" a ti onda odradi insert)
[ nnn @ 06.06.2010. 17:11 ] @
Pa vec sam ga odradio tako select pa ako nema rezultata onda insert. Sad ono sto me nervira kod toga, je program koji modifikujem za svaki upit pravi zasebnu nit i otvara konekciju ka serveru. -.- Tako je napisana klasa.. Ako bi mogao da sve to smestim u jedan upit, onda bi ustedeo, a to je bitno u ovom slucaju.. U principu moze name da bude jedinstveno posto je to user name, i ne mogu da imaju dva korisnika sa istim imenom.
[ bogdan.kecman @ 06.06.2010. 17:25 ] @
ako mu stavis unique contraint onda ce insert ignore da ti odradi posao, samo izracunaj dal ti se isplati da izvrsavas UVEK dve naredbe ... tj kojih slucajeva imas vise - kada treba da dodas novog korisnika ili kad vec imas jednog ...

sto se tice dizajna te klase, otpustite tog lika koji je to dizajnirao
[ nnn @ 10.06.2010. 23:30 ] @
Slicno pitanje, imam tabelu, koju treba da update, ako vec postoji korisnik, da povecam jedan brojac, a ako ne postoji da ga dodam i stavim na nulu. Jel postoji neki fazon za to, ili mora da se prvo proveri da li postoji pa doda ili update?
[ bogdan.kecman @ 10.06.2010. 23:46 ] @
pogledaj MANUAL ?!

http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html


insert into `t1` (name, brojac) values ('pera', 0) on duplicate key update brojac = brojac + 1;

[ Shinhan @ 11.06.2010. 07:17 ] @
Citat:
bogdan.kecman: pogledaj MANUAL ?!

http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html


insert into `t1` (name, brojac) values ('pera', 0) on duplicate key update brojac = brojac + 1;


Jedna napomena. Ako je vrlo velika verovatnoća da record postoji a jako mala verovatnoća da record ne postoji, onda je bolje da napraviš normalan UPDATE, pa samo ako ti se vrati greška da uradiš INSERT ... ON DUPLICATE KEY ... jer je insert on update dosta sporiji od samo update.