|
| MySQL - Sidste id i en tabel - Hvordan? Fra : Ukendt |
Dato : 26-02-03 13:52 |
|
I en MySQL database hvor der er adskillige tabeller har jeg brug for at få
returneret det sidste id i en navngiven tabel.
Det er altså ikke nødvendigvis den tabel der sidst blev skrevet i.
Alle id genereres med AUTO_INCREMENT.
Jeg har søgt i MySQL manualen men synes ikke at jeg fandt noget brugbart.
I øvrigt kører jeg PHP og har da overvejet at bruge "SELECT id FROM table"
og så læse værdien i det sidste felt at resultat-array'et men da jeg
forventer at én af tabellerne på sigt kommer til at rumme 100.000 rows
bliver dette array sikkert for resourcekrævende at håndtere.
Nogen idéer?
På forhånd tak for hjælpen!
Claus
| |
Jonas Koch Bentzen (26-02-2003)
| Kommentar Fra : Jonas Koch Bentzen |
Dato : 26-02-03 14:24 |
|
"Claus Nygaard-Pedersen" <cnpatofir.dk> wrote:
> I en MySQL database hvor der er adskillige tabeller har jeg brug for at få
> returneret det sidste id i en navngiven tabel.
SELECT MAX(id) FROM tabel
--
Jonas Koch Bentzen
| |
Jimmy (26-02-2003)
| Kommentar Fra : Jimmy |
Dato : 26-02-03 14:28 |
|
"Jonas Koch Bentzen" <ingen.email@eksempel.dk> wrote in message
news:b3if55$f16$1@sunsite.dk...
> "Claus Nygaard-Pedersen" <cnpatofir.dk> wrote:
>
> > I en MySQL database hvor der er adskillige tabeller har jeg brug for at
få
> > returneret det sidste id i en navngiven tabel.
>
> SELECT MAX(id) FROM tabel
Hvis det er det *senest* indsatte ID er ovenstående ubrugeligt.
Der skal følgende anvendes:
SELECT LAST_INSERT_ID() AS Last_ID FROM <tabel>
Hvad skal du bruge informationen til?
Mvh
Jimmy
| |
Ukendt (26-02-2003)
| Kommentar Fra : Ukendt |
Dato : 26-02-03 14:36 |
|
"Jimmy" <nyhedsgruppe@get3_erstat_3_med_2_net.dk> skrev i en meddelelse
news:lh37a.1400$mp5.939@news.get2net.dk...
>
> "Jonas Koch Bentzen" <ingen.email@eksempel.dk> wrote in message
> news:b3if55$f16$1@sunsite.dk...
> > "Claus Nygaard-Pedersen" <cnpatofir.dk> wrote:
> >
> > > I en MySQL database hvor der er adskillige tabeller har jeg brug for
at
> få
> > > returneret det sidste id i en navngiven tabel.
> >
> > SELECT MAX(id) FROM tabel
>
>
> Hvis det er det *senest* indsatte ID er ovenstående ubrugeligt.
Sært! Det virker ellers fint. Hvorfor mener du at det er ubrugeligt?
> Der skal følgende anvendes:
>
> SELECT LAST_INSERT_ID() AS Last_ID FROM <tabel>
Det virker til gengæld ikke!
Tak for hjælpen til jer begge :)
Claus
| |
Jimmy (26-02-2003)
| Kommentar Fra : Jimmy |
Dato : 26-02-03 16:05 |
|
"Claus Nygaard-Pedersen" <cnpatofir.dk> wrote in message
news:3e5cc2b1$0$139$edfadb0f@dtext02.news.tele.dk...
> "Jimmy" <nyhedsgruppe@get3_erstat_3_med_2_net.dk> skrev i en meddelelse
> news:lh37a.1400$mp5.939@news.get2net.dk...
> >
> > "Jonas Koch Bentzen" <ingen.email@eksempel.dk> wrote in message
> > news:b3if55$f16$1@sunsite.dk...
> > > "Claus Nygaard-Pedersen" <cnpatofir.dk> wrote:
> > >
> > > > I en MySQL database hvor der er adskillige tabeller har jeg brug for
> at
> > få
> > > > returneret det sidste id i en navngiven tabel.
> > >
> > > SELECT MAX(id) FROM tabel
> >
> >
> > Hvis det er det *senest* indsatte ID er ovenstående ubrugeligt.
>
> Sært! Det virker ellers fint. Hvorfor mener du at det er ubrugeligt?
Forestil dig, at 100 personer indsætter en række i din database på samme
tid.
Du ønsker nu det sidst indsatte ID, men har ingen garanti for, at det
højeste på det tidspunkt du udfører din SELECT er det ID, der blev indsat,
da du indsatte din række.
> > Der skal følgende anvendes:
> >
> > SELECT LAST_INSERT_ID() AS Last_ID FROM <tabel>
>
> Det virker til gengæld ikke!
Så gør du det forkert.
Søg på LAST_INSERT_ID på mysql.com
Mvh
Jimmy
| |
Ukendt (26-02-2003)
| Kommentar Fra : Ukendt |
Dato : 26-02-03 16:25 |
|
"Jimmy" <nyhedsgruppe@get3_erstat_3_med_2_net.dk> skrev i en meddelelse
news:uI47a.1415$f76.51@news.get2net.dk...
>
> "Claus Nygaard-Pedersen" <cnpatofir.dk> wrote in message
> news:3e5cc2b1$0$139$edfadb0f@dtext02.news.tele.dk...
> > "Jimmy" <nyhedsgruppe@get3_erstat_3_med_2_net.dk> skrev i en meddelelse
> > news:lh37a.1400$mp5.939@news.get2net.dk...
> > >
> > > "Jonas Koch Bentzen" <ingen.email@eksempel.dk> wrote in message
> > > news:b3if55$f16$1@sunsite.dk...
> > > > "Claus Nygaard-Pedersen" <cnpatofir.dk> wrote:
> > > >
> > > > > I en MySQL database hvor der er adskillige tabeller har jeg brug
for
> > at
> > > få
> > > > > returneret det sidste id i en navngiven tabel.
> > > >
> > > > SELECT MAX(id) FROM tabel
> > >
> > >
> > > Hvis det er det *senest* indsatte ID er ovenstående ubrugeligt.
> >
> > Sært! Det virker ellers fint. Hvorfor mener du at det er ubrugeligt?
>
> Forestil dig, at 100 personer indsætter en række i din database på samme
> tid.
> Du ønsker nu det sidst indsatte ID, men har ingen garanti for, at det
> højeste på det tidspunkt du udfører din SELECT er det ID, der blev indsat,
> da du indsatte din række.
>
>
> > > Der skal følgende anvendes:
> > >
> > > SELECT LAST_INSERT_ID() AS Last_ID FROM <tabel>
> >
> > Det virker til gengæld ikke!
>
> Så gør du det forkert.
Hmmm! Jeg gjorde nøjagtigt som du skrev.
> Søg på LAST_INSERT_ID på mysql.com
Der gjorde jeg allerede inden jeg skrev mit første indlæg i denne tråd og
som du måske husker... Uden at blive afgørende klogere.
Måske du kan fortælle nøjagtigt hvad det er jeg skal gøre med funktionen?
Claus
| |
Jimmy (26-02-2003)
| Kommentar Fra : Jimmy |
Dato : 26-02-03 16:28 |
|
"Claus Nygaard-Pedersen" <cnpatofir.dk> wrote in message
news:3e5cdc08$0$132$edfadb0f@dtext02.news.tele.dk...
> > > > SELECT LAST_INSERT_ID() AS Last_ID FROM <tabel>
> > >
> > > Det virker til gengæld ikke!
> >
> > Så gør du det forkert.
>
> Hmmm! Jeg gjorde nøjagtigt som du skrev.
1 - Hvilket stykke kode har du præcist brugt?
2 - Hvad var resultatet?
Mvh
Jimmy
| |
Jakob Andersen (26-02-2003)
| Kommentar Fra : Jakob Andersen |
Dato : 26-02-03 16:45 |
|
"Claus Nygaard-Pedersen" <cnpatofir.dk> wrote
> Måske du kan fortælle nøjagtigt hvad det er jeg skal gøre med funktionen?
Fordelen ved at bruge LAST_INSERT_ID funktionen istedet for blot at bruge
MAX funktionen er at LAST_INSERT_ID er afhængig af connection og derfor vil
du altid få returneret ID'et på den række der er indsat vha. ligepræcis den
connection der benyttes.
Dokumentationen for funktionen kan findes her:
< http://www.mysql.com/doc/en/Miscellaneous_functions.html>
--
Jakob Andersen
| |
Jonas Koch Bentzen (26-02-2003)
| Kommentar Fra : Jonas Koch Bentzen |
Dato : 26-02-03 17:52 |
|
Jakob Andersen wrote:
>
> Fordelen ved at bruge LAST_INSERT_ID funktionen istedet for blot at bruge
> MAX funktionen er at LAST_INSERT_ID er afhængig af connection og derfor
> vil du altid få returneret ID'et på den række der er indsat vha.
> ligepræcis den connection der benyttes.
Fint - men det var jo ikke det, han ville have. Det fremgik ret tydeligt, at
han gerne ville have det højeste ID selv i de tilfælde, hvor der ikke i
samme forbindelse er indsat en række.
--
Jonas Koch Bentzen
| |
Jakob Andersen (26-02-2003)
| Kommentar Fra : Jakob Andersen |
Dato : 26-02-03 20:47 |
|
"Jonas Koch Bentzen" <ingen.email@eksempel.dk> wrote
> Fint - men det var jo ikke det, han ville have. Det fremgik ret tydeligt,
at
> han gerne ville have det højeste ID selv i de tilfælde, hvor der ikke i
> samme forbindelse er indsat en række.
Ja, det er jeg godt klar over. Jeg prøvede blot at forklare hvordan
LAST_INSERT_ID virker i forhold til MAX så spørgeren kunne vælge afhængigt
af opgaven en anden god gang. Dette gjorde jeg fordi spørgeren ikke havde
kunnet finde LAST_INSERT_ID i dokumentationen.
Men jeg skal da undskylde hvis jeg har vildledt spørgeren.
--
Jakob Andersen
| |
Kristian Damm Jensen (26-02-2003)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 26-02-03 15:50 |
|
Jimmy wrote:
>
> "Jonas Koch Bentzen" <ingen.email@eksempel.dk> wrote in message
> news:b3if55$f16$1@sunsite.dk...
> > "Claus Nygaard-Pedersen" <cnpatofir.dk> wrote:
> >
> > > I en MySQL database hvor der er adskillige tabeller har jeg brug for at
> få
> > > returneret det sidste id i en navngiven tabel.
> >
> > SELECT MAX(id) FROM tabel
>
> Hvis det er det *senest* indsatte ID er ovenstående ubrugeligt.
> Der skal følgende anvendes:
Efter som der er tale om autoincrement, vil det give samme resultat.
--
Kristian Damm Jensen | Feed the hungry at www.thehungersite.com
kristian-damm.jensen@cgey.com | Two wrongs doesn't make a right,
ICQ# 146728724 | but three lefts do.
| |
Jimmy (26-02-2003)
| Kommentar Fra : Jimmy |
Dato : 26-02-03 16:06 |
|
"Kristian Damm Jensen" <kristian-damm.jensenRE@MOVEcgey.com> wrote in
message news:3E5CD403.67B61866@MOVEcgey.com...
> Jimmy wrote:
> >
> > "Jonas Koch Bentzen" <ingen.email@eksempel.dk> wrote in message
> > news:b3if55$f16$1@sunsite.dk...
> > > "Claus Nygaard-Pedersen" <cnpatofir.dk> wrote:
> > >
> > > > I en MySQL database hvor der er adskillige tabeller har jeg brug for
at
> > få
> > > > returneret det sidste id i en navngiven tabel.
> > >
> > > SELECT MAX(id) FROM tabel
> >
> > Hvis det er det *senest* indsatte ID er ovenstående ubrugeligt.
> > Der skal følgende anvendes:
>
> Efter som der er tale om autoincrement, vil det give samme resultat.
Nej langt fra altid.
Se mit svar til Claus.
Mvh
Jimmy
| |
Ukendt (26-02-2003)
| Kommentar Fra : Ukendt |
Dato : 26-02-03 16:28 |
|
"Jimmy" <nyhedsgruppe@get3_erstat_3_med_2_net.dk> skrev i en meddelelse
news:SI47a.1416$Mi6.1092@news.get2net.dk...
>
> "Kristian Damm Jensen" <kristian-damm.jensenRE@MOVEcgey.com> wrote in
> message news:3E5CD403.67B61866@MOVEcgey.com...
> > Jimmy wrote:
> > >
> > > "Jonas Koch Bentzen" <ingen.email@eksempel.dk> wrote in message
> > > news:b3if55$f16$1@sunsite.dk...
> > > > "Claus Nygaard-Pedersen" <cnpatofir.dk> wrote:
> > > >
> > > > > I en MySQL database hvor der er adskillige tabeller har jeg brug
for
> at
> > > få
> > > > > returneret det sidste id i en navngiven tabel.
> > > >
> > > > SELECT MAX(id) FROM tabel
> > >
> > > Hvis det er det *senest* indsatte ID er ovenstående ubrugeligt.
> > > Der skal følgende anvendes:
> >
> > Efter som der er tale om autoincrement, vil det give samme resultat.
>
> Nej langt fra altid.
> Se mit svar til Claus.
En henvisning til manualen er vist ikke noget svar. Det er helt klart for
mig at disse to kodelinjer langt fra altid giver samme resultat. Faktisk er
det i modsætning til Jonas' forslag endnu ikke lykkedes mig at få noget
brugbart ud af dit.
Når du nu mener at du har ret kunne du ikke fortælle hvorfor dit forslag
skulle være mere korrekt end Jonas' ?
Claus
| |
Jimmy (26-02-2003)
| Kommentar Fra : Jimmy |
Dato : 26-02-03 16:31 |
|
"Claus Nygaard-Pedersen" <cnpatofir.dk> wrote in message
news:3e5cdcc6$0$147$edfadb0f@dtext02.news.tele.dk...
> "Jimmy" <nyhedsgruppe@get3_erstat_3_med_2_net.dk> skrev i en meddelelse
> news:SI47a.1416$Mi6.1092@news.get2net.dk...
> >
> > "Kristian Damm Jensen" <kristian-damm.jensenRE@MOVEcgey.com> wrote in
> > message news:3E5CD403.67B61866@MOVEcgey.com...
> > > Efter som der er tale om autoincrement, vil det give samme resultat.
> >
> > Nej langt fra altid.
> > Se mit svar til Claus.
>
> En henvisning til manualen er vist ikke noget svar.
Det er en god måde at blive klogere på uden at sætte andre til at udføre dit
arbejde.
> Det er helt klart for
> mig at disse to kodelinjer langt fra altid giver samme resultat. Faktisk
er
> det i modsætning til Jonas' forslag endnu ikke lykkedes mig at få noget
> brugbart ud af dit.
Nå.
> Når du nu mener at du har ret kunne du ikke fortælle hvorfor dit forslag
> skulle være mere korrekt end Jonas' ?
Det har jeg gjort.
Jeg har fejlet.
Nu giver jeg op.
Held og lykke.
Mvh
Jimmy
| |
Ukendt (26-02-2003)
| Kommentar Fra : Ukendt |
Dato : 26-02-03 16:45 |
|
"Jimmy" <nyhedsgruppe@get3_erstat_3_med_2_net.dk> skrev i en meddelelse
news:U457a.1427$tE6.821@news.get2net.dk...
>
> "Claus Nygaard-Pedersen" <cnpatofir.dk> wrote in message
> news:3e5cdcc6$0$147$edfadb0f@dtext02.news.tele.dk...
> > "Jimmy" <nyhedsgruppe@get3_erstat_3_med_2_net.dk> skrev i en meddelelse
> > news:SI47a.1416$Mi6.1092@news.get2net.dk...
> > >
> > > "Kristian Damm Jensen" <kristian-damm.jensenRE@MOVEcgey.com> wrote in
> > > message news:3E5CD403.67B61866@MOVEcgey.com...
>
> > > > Efter som der er tale om autoincrement, vil det give samme resultat.
> > >
> > > Nej langt fra altid.
> > > Se mit svar til Claus.
> >
> > En henvisning til manualen er vist ikke noget svar.
>
> Det er en god måde at blive klogere på uden at sætte andre til at udføre
dit
> arbejde.
Sandt, men at spørge om tingenes sammenhæng kan vel næppe kaldes at bede
andre om at udføre mit arbejde.
> > Det er helt klart for
> > mig at disse to kodelinjer langt fra altid giver samme resultat. Faktisk
> er
> > det i modsætning til Jonas' forslag endnu ikke lykkedes mig at få noget
> > brugbart ud af dit.
>
> Nå.
>
>
> > Når du nu mener at du har ret kunne du ikke fortælle hvorfor dit forslag
> > skulle være mere korrekt end Jonas' ?
>
> Det har jeg gjort.
Jeg har nu kigget tråden igennem om må så konstatere at jeg ikke fangede
følgende som du skrev tidligere:
<citat>
Forestil dig, at 100 personer indsætter en række i din database på samme
tid.
Du ønsker nu det sidst indsatte ID, men har ingen garanti for, at det
højeste på det tidspunkt du udfører din SELECT er det ID, der blev indsat,
da du indsatte din række.
</citat>
Det forekommer mig at jeg ikke fik formuleret mit spørgsmål tydeligt nok for
du antager at det id jeg søger har noget at gøre med en række som jeg netop
har indsat. Dette er ikke korrekt. Jeg ønsker blot det højeste id for en
given tabel.
> Jeg har fejlet.
> Nu giver jeg op.
>
> Held og lykke.
Tak og tak for din tid!
God weekend
Claus
| |
Morten Guldager (26-02-2003)
| Kommentar Fra : Morten Guldager |
Dato : 26-02-03 21:09 |
|
Wed, 26 Feb 2003 at 13:23 GMT Jonas Koch Bentzen wrote
> "Claus Nygaard-Pedersen" <cnpatofir.dk> wrote:
>
>> I en MySQL database hvor der er adskillige tabeller har jeg brug for at få
>> returneret det sidste id i en navngiven tabel.
>
> SELECT MAX(id) FROM tabel
Enig, auto_increment giver altid en højere værdi og derfor må
den største være den sidste.
Men hvis du koder til et multitasking setup (f.eks. web) og du vil
være sikker på at den sidste stadig er den sidste når du begynder
at bruge den er det nødvændigt med en lås. Se f.eks. på "lock table"
/Morten
| |
Ukendt (27-02-2003)
| Kommentar Fra : Ukendt |
Dato : 27-02-03 15:12 |
|
On Wed, 26 Feb 2003 13:52:20 +0100, "Claus Nygaard-Pedersen"
<cnpatofir.dk> wrote:
>I en MySQL database hvor der er adskillige tabeller har jeg brug for at få
>returneret det sidste id i en navngiven tabel.
>
>Det er altså ikke nødvendigvis den tabel der sidst blev skrevet i.
>
>Alle id genereres med AUTO_INCREMENT.
>
>
>Jeg har søgt i MySQL manualen men synes ikke at jeg fandt noget brugbart.
>
>I øvrigt kører jeg PHP og har da overvejet at bruge "SELECT id FROM table"
>og så læse værdien i det sidste felt at resultat-array'et men da jeg
>forventer at én af tabellerne på sigt kommer til at rumme 100.000 rows
>bliver dette array sikkert for resourcekrævende at håndtere.
Hvis det er lige efter dit sidste INSERT så kan du bruge følgende i
PHP
$indsaet = mysql_query("SELECT ..... ") OR DIE (mysql_error());
$last_insert = mysql_last_insert($indsaet) + 1;
| |
|
|