Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  7 1485
God morgen freaks, det er meg igjen med enda en underlig spekulasjon innen web-utvikling. Denne gangen relatert til MySQL, da jeg leser en bok om det as we speak. Vel.

Nå er det slik at når du lager en rad i en database, at du ellers ikke har kontroll over selve "auto-increment"-id verdien. Altså, jeg vet ikke hvilken unik id-verdi raden kommer til å få. Jeg har nå lest i et par timer på internet og stadig dukker det opp en metode for å fange MAX(); vardien av auto-increment ID. Men det synes jeg er veldig svakt og her er grunnen:

Hvis to personer (Ola og Kari) lager en rad i en DB samtidig, kan man risikere at id verdien som er MAX(); vil overlappe hverandre slik at man får samme ID for både Ola og Kari, nemelig MAX-id til Kari som registrerte seg et millisekund før Ola.

Jeg vet at man kan løse problemet med å dobbeltsjekke mot et parameter som man har ellers kontroll over, men det synes jeg blir altfor dårlig. Isåfall må man sjekke max minus 1 maxminus 2 max minus 3 verdiene i en for-loop inntil man treffer den som har riktig parameter. Jeg synes denne metoden overlaster serverene unødvendig. Jeg mener det må finnes en enklere løsning?

Hvordan får jeg tak i auto-increment verdien (INT) til raden som jeg lager? Hvordan gjør dere det !? Hva anbefaler dere? Mange takk.
z0p
uʍop ǝpısdn
z0p's Avatar
hvorfor skal du ha denne før du setter inn en rad?
Ikke en gang MySQL vet hvilken id en rad får før den er satt inn, ettersom det kan komme andre rader og ta id'en helt til siste øyeblikk. Det er kun i ettertid man vet id'en og da finner man den med mysql_insert_id() som marfo sier.
z0p
uʍop ǝpısdn
z0p's Avatar
Jeg ser heller ingen bruksområder for id før den er i bruk. Dersom du ønsker å gjøre noe i sql etter at du har satt inn en rad lager du en trigger after insert og bruker verdien av LAST_INSERT_ID(). Men dersom du trenger dette er det gjerne en pekepinn på dårlig design

Kode

SELECT id from teenageninjamutantturtles SORT by id DESC LIMIT 1;
Nå er ikke jeg kjent med MAX(); -- men tar jeg ikke helt feil så er auto_increment noe som er en automatisk måte å plusse på et tall og slenge det inn med den nye inserten.
Om du bruker koden over, så vil du få den aller siste ID-en som er generert, før, eller etter du har inserta den.

Om du bruker den FØR du inserter, kan du enkelt plusse på 1, og få det neste nummeret som insertes.
Om du bruker den ETTER du har insertet, får du .. det siste nummeret som har blitt inserta.

En finfin regel er å scripte det slik at den dobbeltsjekker med databasen om id-en fins fra før av, og heller genererer ny id dersom den fins fra før.
z0p
uʍop ǝpısdn
z0p's Avatar
Dersom man skal gjøre noe slik bør man gjøre en transaction for å unngå feil.
man må også en ifnull(select-stmnt, start-index) i så fall. uansett er det jo bedre å la mysql håndtere inckrementeringa dersom man uansett bare skal plusse på id.
Sitat av RandomiZed Vis innlegg

Kode

SELECT id from teenageninjamutantturtles SORT by id DESC LIMIT 1;
Nå er ikke jeg kjent med MAX(); -- men tar jeg ikke helt feil så er auto_increment noe som er en automatisk måte å plusse på et tall og slenge det inn med den nye inserten.
Om du bruker koden over, så vil du få den aller siste ID-en som er generert, før, eller etter du har inserta den.
Vis hele sitatet...
Nå var det forklart i første innlegg hvorfor dette er feil.