Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kokoska ili jaje

[es] :: MySQL :: Kokoska ili jaje

[ Pregleda: 2913 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

slobytox
Slobodan Jovanovic
Srbija

Član broj: 41212
Poruke: 21
*.ptt.yu.



Profil

icon Kokoska ili jaje07.11.2006. u 18:44 - pre 169 meseci
Molim za savet, kako biste vi reseili sledeci problem:

Imam recimo tabelu t1 i u njoj polja p1, p2 itd.
p1 je primarni kljuc (auto_increment) biginit(20)
p2 je samo biginit(20)

Hocu jednom sql naredbom da izvrsim insert u tu tabelu ali da se u p2 upise vrednost koja ce biti upisana i u p1 (formirana auto_increment-om)
Naravno od izuzetne je vaznosti da resenje bude potpuno pouzdano i u situaciji da istu bazu koristi 100 operatera i da recimo u istom trenutku ima 40-ak konekcija.

Ne mogu p2 podesiti da bude auto_increment jer prilikom update-a drugacije obradjujem podatke u p2 (u suprotnom naravno p2 i ne bi imalo smisla da egzistira).

Mislim da problem potice odatle st mysql poslednje upisuje p1 polje i tada mu i formira vrednost tako da uopste ne znam kako ovo da resim a da bude brzo i pouzdano.

Pozdrav,
SJ
-----------------
SJ
 
Odgovor na temu

zmau
Dragan Jovanović
programer
Šabac

Član broj: 80834
Poruke: 290
*.111.eunet.yu.



+80 Profil

icon Re: Kokoska ili jaje08.11.2006. u 00:33 - pre 169 meseci
Vidi funkciju LAST_INSERT_ID(). U helpu piše između ostalog The ID that was generated is maintained in the server on a per-connection basis

Znači, biće nešto kao
Code:

insert into tabela(p2) values (0);
update tabela set p2 = p1
where p1 = LAST_INSERT_ID();

i to je to.
it works on my machine
 
Odgovor na temu

slobytox
Slobodan Jovanovic
Srbija

Član broj: 41212
Poruke: 21
194.106.187.*



Profil

icon Re: Kokoska ili jaje08.11.2006. u 15:14 - pre 169 meseci
Znam za to ali u toj varijanti procesoru treba vise nego duplo vremena u poredjenju sa varijantom da problem resim samo jednom insert komandom.
Pored toga ja mysql-u pristupam preko PHP-a tako da je on klijent za mysql. Za svakog usera (operatera) imam poseban username i password u mysql-u i za svakog se formira prakticno posebna konekcija ali ne koristim permanentne konekcije. To moze da zakomplikuje primenu ovog resenja i da ga ucini nepouzdanim.

Da li postoji neko elegantnije i pouzdanije resenje????
-----------------
SJ
 
Odgovor na temu

shketuljko
Vedran Martinovic
Institut za javno zdravlje Srbije „Dr
Milan Jovanović Batut”
Beograd

Član broj: 1370
Poruke: 43
212.200.118.*

Sajt: www.besplatnioglasi.rs


Profil

icon Re: Kokoska ili jaje08.11.2006. u 16:45 - pre 169 meseci
Pod pretpostavkom da pricamo o autoincrementu
ja bih ovako uradio:


Code:
SELECT max( `id2` ) from `tbl`
Rezultat povecao za 1 i odradio insert:

INSERT INTO `tbl` (`id2`) values (rezultat);



Trosenje resursa je smanjeno u odnosu na insert pa update!!!
Vedran Martinovic
www.besplatnioglasi.rs
 
Odgovor na temu

slobytox
Slobodan Jovanovic
Srbija

Član broj: 41212
Poruke: 21
194.106.187.*



Profil

icon Re: Kokoska ili jaje08.11.2006. u 16:56 - pre 169 meseci
Jeste manje trosenje resursa ali kada je baza opterecena velikim brojem unosa moze se desiti da izmedju komandi select i insert protrci insert od drugog usera (druga konekcija) i to bi bio kraj price za bazu.
Ne mogu da verujem da za ovaj problem ne postoji neko elegantno resenje?
-----------------
SJ
 
Odgovor na temu

Zmaj
Predrag Krstić
web developer
Zrenjanin

Član broj: 1035
Poruke: 382
195.252.127.*

Sajt: www.zmajevognezdo.com


+4 Profil

icon Re: Kokoska ili jaje08.11.2006. u 17:34 - pre 169 meseci
zasto se opterecujes sa tako banalnim stvarima, koliko se cesto taj upit desava da bi ti bila potrebna takva optimizacija, jednostavno uradi query insert uzmes last id sa mysql_insert_id(); i ubacis ga u drugi query. zasto ti ovo nije dovoljno elegantno. I nemoj da brines o procesoru, i njegovom vremenu, stavi u kod deo sto meri vreme, pa ces videti sta ti je ciniti. ali opet ti kazem lupas glavu oko nepotrebnih stvari
 
Odgovor na temu

shketuljko
Vedran Martinovic
Institut za javno zdravlje Srbije „Dr
Milan Jovanović Batut”
Beograd

Član broj: 1370
Poruke: 43
212.200.118.*

Sajt: www.besplatnioglasi.rs


Profil

icon Re: Kokoska ili jaje08.11.2006. u 17:46 - pre 169 meseci
Ako oces da se osiguras pokreni transakciju i iskombinuj nesto!
Tako ces biti siguran da je upit prosao (vise upita)

I ja se slazem da mozda ne treba da lupas glavu jer mislim da vrijeme potroseno ne moze biti veliko, ali sam siguran da update vuce vise vremena nego select
Vedran Martinovic
www.besplatnioglasi.rs
 
Odgovor na temu

zikaa
Zivorad Antonijevic
Beograd

Član broj: 10078
Poruke: 106
*.beotel.net.

Sajt: zantonijevic.com


+1 Profil

icon Re: Kokoska ili jaje09.11.2006. u 09:25 - pre 169 meseci
a da pokusas da simuliras auto_increment vrednost
Code:
 insert into tabela (id1,id2)  (select max(id1)+1, max(id1)+1 from tabela) 
 
Odgovor na temu

slobytox
Slobodan Jovanovic
Srbija

Član broj: 41212
Poruke: 21
194.106.187.*



Profil

icon Re: Kokoska ili jaje09.11.2006. u 14:33 - pre 169 meseci
Citat:
Zmaj: zasto se opterecujes sa tako banalnim stvarima, koliko se cesto taj upit desava da bi ti bila potrebna takva optimizacija, jednostavno uradi query insert uzmes last id sa mysql_insert_id(); i ubacis ga u drugi query. zasto ti ovo nije dovoljno elegantno. I nemoj da brines o procesoru, i njegovom vremenu, stavi u kod deo sto meri vreme, pa ces videti sta ti je ciniti. ali opet ti kazem lupas glavu oko nepotrebnih stvari


Desava se prilikom svakog unosa u bazu ili izmene podataka (oko 100000 puta dnevno). Upit je posledica koncepcije programa i to mogu ali ne zelim da menjam jer bih izgubio deo funkcionalnosti koji smatram veoma vaznim.
To je siroka tema da bismo je ukljucili u diskusiju o MySQL-u. Ja sam se ovde fokusirao na konkretnu potrebu i nacin kako to realizovati u MySQL-u.

Ja to trenutno radim tako sto upisem pa izvrsim update ali zeleo bih da znam da li je moguce ikako to uraditi jednom naredbom a da pri tome bude potpuno pouzdano.
Ovo jeste pravo pitanje za MySQL support ali kad se nema para ....

Citat:
zikaa: a da pokusas da simuliras auto_increment vrednost
Code:
 insert into tabela (id1,id2)  (select max(id1)+1, max(id1)+1 from tabela) 


Nesigurno nemam garancije da preko druge konekcije nece protrcati drugi insert izmedju izvrsenja podupita i inserta.
-----------------
SJ
 
Odgovor na temu

slobytox
Slobodan Jovanovic
Srbija

Član broj: 41212
Poruke: 21
194.106.187.*



Profil

icon Re: Kokoska ili jaje09.11.2006. u 14:42 - pre 169 meseci
Zaboravih da kazem da je baza skoro 2GB i imajuci u vidu hardware i opterecenje svaki detalj postaje vazan sto se tice optimizacije (vecina upita se korektno izvrsava ali pojedini nesto malo slozeniji se izvrsavaju i vise od 60 sec a upiti za statistiku i analitiku traju po nekoliko minuta).
Bez obzira na to za sada sam zadovoljan radom MySQL-a i u poredjenju sa SQL-serverom radi brze.
Baza se inace vrlo frekventno koristi (skoro 2 miliona upita dnevno tako da je to dodatno ogranicenje).

-----------------
SJ
 
Odgovor na temu

Zmaj
Predrag Krstić
web developer
Zrenjanin

Član broj: 1035
Poruke: 382
195.252.127.*

Sajt: www.zmajevognezdo.com


+4 Profil

icon Re: Kokoska ili jaje09.11.2006. u 15:57 - pre 169 meseci
onda pogledaj transakcije, zapocnes transakciju uradiste upite i zavrsis transakciju, to tije sigurno i server odradjuje upise tek kad zavrsis transakciju
 
Odgovor na temu

slobytox
Slobodan Jovanovic
Srbija

Član broj: 41212
Poruke: 21
*.beotel.net.



Profil

icon Re: Kokoska ili jaje10.11.2006. u 21:31 - pre 169 meseci
Citat:
Zmaj: onda pogledaj transakcije, zapocnes transakciju uradiste upite i zavrsis transakciju, to tije sigurno i server odradjuje upise tek kad zavrsis transakciju


Dobro a sta se desava sa ostalim userima koji preko drugih konekcija pokusavaju u istom treutku da odrade upis u istu tabelu. Da li transakcija zakljucava tabelu za sve sem za konekciju koja je pokrenula transakciju ili samo testira unos i potvrdjuje ukoliko je sve u redu odnosno vraca na staro ako ima problema???
Ukoliko zakljucava tabelu onda je to ujedno i najsporiji nacin jer su ostali na cekanju, update je u tom slucaju brzi.
-----------------
SJ
 
Odgovor na temu

Zmaj
Predrag Krstić
web developer
Zrenjanin

Član broj: 1035
Poruke: 382
195.252.127.*

Sajt: www.zmajevognezdo.com


+4 Profil

icon Re: Kokoska ili jaje11.11.2006. u 14:37 - pre 169 meseci
pogledaj ovo na
http://dev.mysql.com/books/mysqlpress/mysql-tutorial/ch10.html

to je prica o transakcijama u mysql.

nadam se da sam ti pomogao, posto dosad nisam imao potrebe za transakcjama, nemogu da ti prenesem licna iskustva. izmeri vreme potrebno za izvrsavanje nekog upita pa ces doci do opipljivih rezultata, i ono sto je sporo mozda je dovoljno za tvoje potrebe od 100.000 upisa dnevno
 
Odgovor na temu

Dejan Topalovic
Dejan Topalović
Senior Oracle DBA & Senior PL/SQL
Developer, Erste Sparinvest (Erste
Bank), Vienna, Austria
Vienna

Član broj: 635
Poruke: 1374
*.it-austria.net.

Sajt: www.baze-podataka.net


+2 Profil

icon Re: Kokoska ili jaje15.11.2006. u 16:51 - pre 168 meseci
Hm, nije mi jasno zasto bi tako radio, ako kazes da tu vrijednost kasnije tako i tako mijenjas prilikom updatea...
Ako ti ta vrijednost treba za neko izracunavanje prije updatea, onda koristi SELECT IFNULL(p2, p1) i gotova prica, jer ti je samo p1 referenca pri SELECT-u...
Blog - baze podataka
---------------------
Oracle OCP DBA (9i & 10g)
Oracle Database: SQL Certified Expert
Oracle OCP Developer
Certified MySQL DBA
 
Odgovor na temu

misk0
.: Lugano :. _.: CH :.

SuperModerator
Član broj: 634
Poruke: 2824
*.adsl.ticino.com.

ICQ: 46802502


+49 Profil

icon Re: Kokoska ili jaje15.11.2006. u 21:56 - pre 168 meseci
Citat:

"The value of mysql_insert_id() is affected only by statements issued within the current client connection. It is not affected by statements issued by other clients."


Ovo je Dejan napisao u jednoj drugoj temi ali to je ono sto tebi rjesava problem. Znaci sa tom komandom imas defitivno ID od rekorda insertovanog u toj sesiji tj toj konekciji tako da te ne interesuje da li je u medjuvremenu u bazu unesen jos 1 ili 5 rekoda sa vecim IDom.

Bar tako ja kontam..

:: Nemoj se svadjati sa budalom, ljudi cesto nece primjetiti razliku ::
 
Odgovor na temu

[es] :: MySQL :: Kokoska ili jaje

[ Pregleda: 2913 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.