"Troels Arvin" <troels@arvin.dk> wrote in message
news:pan.2003.08.26.15.12.19.313198@arvin.dk...
> On Tue, 26 Aug 2003 12:12:50 +0200, Jimmy wrote:
>
> > Grunden til at jeg ikke vil vælge MAX er beskrevet i forbindelse med
> > LAST_INSERT_ID() 100 gange
>
> Jeg har googlet lidt og kan ikke umiddelbart finde det. Kan du ikke
> opsummere hurtigt?
Naturligvis - Der er dog intet nyt i det for dig.
Vi snakker her om at finde det senest indsatte ID, som mange finder via
SELECT MAX(ID).
Du ønsker nu at finde det ID, som du lige har fået tildelt af MySQL, og
anvender SELECT MAX(ID).
MEN du har ingen garanti for, at det returnede tal svarer til *dit* senest
indsatte ID, da 10000 personer kan indsætte rækker på samme tid som dig.
Dérfor skal man anvende LAST_INSERT_ID() til at finde ens eget senest
indsatte ID.
> >> > SHOW TABLE STATUS LIKE '[table]'
> >> >
> >> > Den giver en række data omkring tabellen, bl.a en der hedder
> >> > "Auto_increment"
> >>
> >> Hvorfor er det bedre end SELECT MAX(...)?
> >
> > Det er den MySQL *selv* siger den vil bruge næste gang. MAX(ID)+1 er
> > din *forventning* om at den altid lægger een til højeste nummer.
>
> Men hvis du først aflæser næstkommende auto_increment-værdi, for
> derefter at benytte værdien i en insert, kan det samme da også ske: I
> mellemtiden kan der være tilføjet eller slettet en række fra
> pågældende tabel. At forhindre den slags kræver samtidigheds-kontrol,
> fx. i form af låsning af tabellen eller passende valg af
> isolations-niveau, hvis éns MySQL understøtter transaktioner.
Dette er fuldstændigt korrekt.
Det blev også bemærket af Harald, hvor jeg skrev stort set det samme som
dig.
Opsummering:
- Ønsker man at finde det ID MySQL netop anvendte i ens egen netop indsatte
række,
skal man anvende LAST_INSERT_ID()
- Ønsker man at finde det ID MySQL har tænkt sig at anvende ved næste
INSERT skal man anvende
SHOW TABLE STATUS LIKE '[table]' og suge informationen derfra.
Man kan ikke stole på at MAX(ID)+1 vil returnere det næste ID, da en slettet
rækkes ID ikke vil genbruges.
Min personlige holdning er dog, at det er en fejl at anvende datatypen
AUTO_INCREMENT, hvis man oplever behov for at finde det næste ID.
Der skal man generere sine egne unikke primærnøgler.
Mvh
Jimmy