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

duplicate key prilikom insert sintakse

[es] :: MySQL :: duplicate key prilikom insert sintakse

[ Pregleda: 2251 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

drugtito
Milovan Djilas

Član broj: 138118
Poruke: 56
93.86.93.*



+1 Profil

icon duplicate key prilikom insert sintakse28.12.2009. u 01:24 - pre 174 meseci
Code:

"INSERT into s_racuni SELECT LAST_INSERT_ID(),br_rac,operater,sifra,naziv,kolicina,iznos from racun"


Polja iz obe tabele su indenticna ( Id,br_rac,operater,sifra,naziv,kolicina,iznos ).
U pitanju je MySQL 5.5, ODBC driver 5.1.
Tabela s_racuni je zbirna za sve odstampane racune.
Prilikom stampe kopiraju se podaci tj. pamte iz racun -> s_racuni,
pa nakon toga naravno racun prazni radi novog unosa.
E sad prijavljuje mi 'duplicate key (neki recimo 9 ili 20) for primary key' error prvi put.
Zatim izadjem iz programa (podaci u racun tabeli ostanu) pokrenem ponovo
i sve prodje kako treba.
Restartujem program (ponovo novi racun, stampa) opet error. restartujem prodje ...........................................

Pomoc!
please
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: duplicate key prilikom insert sintakse28.12.2009. u 11:52 - pre 174 meseci


Mogu samo da nagadjam sta si hteo da izvedes ovim upitom, ali mogu da ti kazem tacno sta ce mysql uraditi sa njim ...

kada napravis konekciju prvi put, pre nego sto bilo sta insertujes ovaj upit ce biti

Code:

INSERT into s_racuni SELECT 0,br_rac,operater,sifra,naziv,kolicina,iznos from racun


posto do tada nisi nista insertovao te last_insert_id() vraca 0. kada se ovaj insert izvrsi, i doda jedno 200 slogova (tj koliko ih vec ima u tabeli racun) i svaki taj slog dobije id, a poslednji id bude recimo 1234 (ako je id auto_increment, ako nije i ovo ce da pukne) sledeci put kada uradis ovaj upit (pod pretpostavkom da u medjuvremenu nista nisi insertovo u toj sesiji) on ce biti

Code:

INSERT into s_racuni SELECT 1234,br_rac,operater,sifra,naziv,kolicina,iznos from racun


sto znaci da ce probati da upise u ID tacno onu vrednost koja sigurno postoji (dakle malopre si insertovo id 1234) dakle mora da pukne sa "duplicate key" posto jeli, jeste duplicate ...

pritom, ovo je simplificiran pogled posto svaki ovaj insert ne insertuje 1 nego "count(*) from racun" redova

dakle, pitanje je sta si hteo da dobijes sa tim last_insert_id() u ovom upitu .. ovako kako si ga napisao jedno za drugim upit jako nema smisla .. iskreno, upit meni licno nema smisla da se ikad nadje u aplikaciji cak i sa nekom drugom vrednoscu umesto last_insert_id() posto ovaj upit na tabelu s_racuni dodaje celokupan sadrzaj tabele racun .. sve i da je tabela racun temporary tabela koncept bas i nema smisla
 
Odgovor na temu

drugtito
Milovan Djilas

Član broj: 138118
Poruke: 56
93.86.93.*



+1 Profil

icon Re: duplicate key prilikom insert sintakse28.12.2009. u 12:02 - pre 174 meseci
Da li moze ovako

Code:

INSERT into s_racuni Id,br_rac,operater,sifra,naziv,kolicina,iznos from racun
ON DUPLICATE Key UPDATE racuni2009.Id=racuni2009.Id


Generalno posto obe tabele sadrze Id polje (primary)
zelim da izbegnem dupliacte, jer je autoincrement.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: duplicate key prilikom insert sintakse28.12.2009. u 12:13 - pre 174 meseci
ne.

ako samo zelis da izbegnes duplicate a ID je auto_increment...

Code:

INSERT into s_racuni 
  (br_rac,operater,sifra,naziv,kolicina,iznos)
SELECT
  br_rac,operater,sifra,naziv,kolicina,iznos 
FROM racun


ili

Code:

INSERT into s_racuni 
SELECT
  NULL, br_rac,operater,sifra,naziv,kolicina,iznos 
FROM racun



 
Odgovor na temu

drugtito
Milovan Djilas

Član broj: 138118
Poruke: 56
93.86.93.*



+1 Profil

icon Re: duplicate key prilikom insert sintakse28.12.2009. u 12:24 - pre 174 meseci
ok hvala
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: duplicate key prilikom insert sintakse28.12.2009. u 17:53 - pre 174 meseci
znas ono "od kako su fenicani .." :D

salim se .. hvala tebi sto pitas a ne "budzis" to kao sto sam vidjao ... bas skoro sam video neku aplikaciju (pisali naravno, ko drugi nego indijci, od njih ni kinezi nisu gori :( ), gde je lik imao nesto tipa

tabela je:
Code:

create table t1 (id int auto_increment primary key, a int, b int);


pa je imao metodu u nekoj klasi
Code:


String getMax(){
...
try{
  ...
  ret = db.getSingleIntValue("select max(id) from "+TABLE);
  ret = ret+1;
  ...
} catch (Exception ex){
  ret = 0;
}
...


a negde u inicijalizaciji konekcije je imao dve metode, jednu za connect() a drugu za init() gde je u connect radio konekciju na bazu a u init() radio popunjavanje konstanti (tipa onaj TABLE) ... dakle nesto tipa

Code:

connect(){
  ...
  try{
    sql.connect("localhost", "usr", "pass", "database");
  } catch (Exception ex){
    ...
}

init(){
...
   TABLE = "t1";
...
}


i u klasama gde radi sa bazom ima u konstruktoru nesto tipa
Code:

...
  db.connect();
  db.init();
...


a u desktruktoru negde uradi disconnect, negde ne .. nije ni bitno ... i sad sta je fora .. sad ide GENIJE !!!!

Code:

...
   db.disconnect(); 
   db = new DBmanager();
   db.connect();
   db.exec("insert into t1 values ("+getMax()+","0,0)");
   db.init();
...


dakle GENIJE je skontao da ako ne pozove init() njegov inser radi :D ... (naravno zato sto ako ne uradi init onaj upit prsne posto nema setovano TABELA i vrati 0, a onda ovaj upit, gde je t1 hardkodirano (iako je u 99% aplikacije ime tabele u varijabli) ubije konekciju, pa je napravi ponovo, pa pozove upit (koji prodje posto getmax() vrati 0 sto je za auto_increment ok) i onda pozove init() da ostali deo ap[likacije radi kako treba ...

malo sam simplifikovo sta je covek stvarno uradio ... ali mislim da je jasno ....

zato cu ja uvek da pomognem koliko god mogu da takvih "genija" bude sve manje i manje i da ljudi sto vise i vise pocnu da prave stvari kako treba ...

nije bas direktno vezano za ovaj topic, al cisto me ponukalo da ispricam kakvih sve "programera" ima ... (ta indija je cudo, nije ni cudo obzirom sta jedu :D )

 
Odgovor na temu

Shinhan
PHP programmer
Subotica

Član broj: 12327
Poruke: 372
*.static.isp.telekom.rs.

Jabber: shinhan@elitesecurity.org
ICQ: 400847988


+4 Profil

icon Re: duplicate key prilikom insert sintakse29.12.2009. u 07:16 - pre 174 meseci
Da li možda ovo što si radio može da se uradi sa Insert triggerom?
[url]http://dev.mysql.com/doc/refman/5.0/en/triggers.html[/url]
"Common sense is not so common." - Voltaire
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: duplicate key prilikom insert sintakse29.12.2009. u 07:27 - pre 174 meseci
paaaaaaaaa ... vidi .. generalno da - ali zasto ???

imas id koji je auto_increment. Ako je neces da ga koristis kao auto_increment onda je to zasebna prica i mozemo da na razlicite nacine resimo razlicite zahteve .. ali, ako si polje definisao kao auto_increment, nemas sta da pises po njemu osim NULL (i ako ne koristis ni jedan sql_mod mozes i 0 da upises unutra - rezultat je isti). Ili ga preskocis kada radis insert (pa mu mysql automatski salje null) ili mu upises null (ili nulu) i storage engine ce vec da odradi sta i kako je proektovan da tu upise validnu vrednost. Rucno upisivanje vrednosti u auto_increment polje je logicka greska.

diskutabilno je da li je auto_increment uvek "dobro resenje" ili je mozda bolje koristiti neki drugi nacin za generisanje tog id-a. Ima dosta primera kada je to pogubno za sistem, ima primera kada je uzasno sporo, ima .. ima .. ima .. ali ako ne ulazimo u to kako je neko dizajnirao tabelu, ako je polje auto_increment - nema "nikad" razloga da u to polje upisujes vrednost koja je razlicita od null (ili 0) (nikad je pod navodnicima posto uvek postoje izuzetne situacije, ali ovde sigurno ne pricamo o jednoj takvoj).




 
Odgovor na temu

drugtito
Milovan Djilas

Član broj: 138118
Poruke: 56
109.93.10.*



+1 Profil

icon Re: duplicate key prilikom insert sintakse30.12.2009. u 00:52 - pre 174 meseci
Mosez li mi pojasniti to
kada je pogubno za sistem?
Ja generalno u svaku tabelu koju definisem ubacim
prvo polje Id autoincrement primary key.
Voleo bih da znam kakve stvari mogu biti
pogubne? da li moze da uspori sistem?
Nikad se nisam bavio preterano dizajniranjem baze,
vise povezujem nekom svojom logikom
ali mi je id primary do sad bio zakon u svakoj tabeli.

unapred hvala
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: duplicate key prilikom insert sintakse30.12.2009. u 02:29 - pre 174 meseci
problemi nastaju pri velikoj konkurentnosti ... ako imas 500 ili 5000 tredova koji rade insert u tabelu sa auto_increment poljem, to postaje veliki problem posto je "dobijanje auto_increment vrednosti" atomic operacija sto znaci da svi ostali cekaju dok ti ne dobijes tvoj auto_increment broj... na maloj konkurentnosti je to nebitno ... 5.5.0 ima to reseno oko ~20 puta bolje nego 5.0 i 5.1 (do neke verzije, novi 5.1 ima prilicno slicno resenje resenju koje je sad u 5.5) ...

drugo, u "sistemu" moze da bude problem, posebno kod statement based replikacije ima mnogo prilika kada je auto_increment "unsafe" za statement base replikaciju (za row based je uvek safe) ... za master-master replikaciju kod autoincrement polja mora da se vodi posebno racuna (pa se setuje razliciti increment value od 1 i slicno) ... najjednostavniji primer je da imas dva servera u replikaciji, ugasis aplikaciju (Dakle nemas nikakve upite nad serverima) resetujes jedan server, upalis aplikaciju ... realno - u ovom slucaju bi trebalo da sve sljaka ... al nije "isto" posto sada auto_increment na jednom i na drugom serveru nece vratiti istu vrednost. (posto innodb gubi auto_increment vrednost pri resetu i preracunava je iz tabele pri prvom access-u istoj)... mysql sistem za replikaciju pokusava ovo da ispegla slanjem auto_inc vrednosti ali to radi za obican "insert into lalala" ali u nekim slucajevima ne moze da se progura ..

i na kraju, imas distribuirane storage engine kao npr ndbcluster gde je auto_increment poprilicno spora i naporna stvar ... tu se stvari resavaju raznim forama kao sto je prealociranje id-eva ... sto realno pravi "rupe" u id nizu (to da se id-ovi ne povecavaju sa vremenom kada je slog insertovan ne vazi nikad, ali ovde to skoro nikad nije ni slucajno tako)...

sve u svemu za 10 konekcija, single server - nemas problem :)
za myisam isto nemas "problem", myisam ne poznaje transakcije i ima samo table lock tako da ti svejedno zakljucas celu tabelu kad radis insert, auto_increment mu se nalazi u metadata tako da tu nema neke velike filozofije (zato myisam cuva vrednost za nex auto_increment value za razliku od innodb-a koji tu vrednost gubi pri restartu), myisam je pri velikoj konkurentnosti "isto spor" imao ti auto_inc ili nemao


eto to ti je ukratko
 
Odgovor na temu

MarkoBalkan

Član broj: 141124
Poruke: 1624
..129.110-dsl.net.metronet.hr.



+19 Profil

icon Re: duplicate key prilikom insert sintakse30.12.2009. u 13:41 - pre 174 meseci
Citat:
bogdan.kecman

zato myisam cuva vrednost za nex auto_increment value za razliku od innodb-a koji tu vrednost gubi pri restartu, myisam je pri velikoj konkurentnosti "isto spor" imao ti auto_inc ili nemao




čini se da je ekipa popravila auto_increment na innodb storage-u na 5.1.41 verziji.

kad se mysql ugasi pa opet digne, innodb pamti zadnju auto_increment vrijednost.

isprobano.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: duplicate key prilikom insert sintakse30.12.2009. u 13:54 - pre 174 meseci
nema to veze sa popravljanjem, nema nikakav "standard" gde pise da treba da ga cuva ... ovakvo ponasanje gde pri prvom accessu tabeli on nadje prvi po redu i uzme ga za ai je potpuno ok

sto se tice "pamcenja" ne pamti ga ni u 5.1.41, to ti se samo ucinilo :)
 
Odgovor na temu

[es] :: MySQL :: duplicate key prilikom insert sintakse

[ Pregleda: 2251 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

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