Avatar billede gruppe_trio Nybegynder
04. marts 2003 - 15:42 Der er 13 kommentarer og
1 løsning

Automatisk ID når man gemmer data i en database

Vi er i gang med Java og MySQL. I forbindelse med at vi skal gemme data i databasen, har vi forstået at man kan bruge AUTO_INCREMENT for at lave unikt ID. Er dette korrekt forstået?

Hvordan får man så fat på det højeste ID i en bestemt tabel?
Avatar billede Slettet bruger
04. marts 2003 - 15:44 #1
ja det er korrekt at i skal bruge AUTO_INCREMENT til at give hver række et unikt id automatisk
Avatar billede Slettet bruger
04. marts 2003 - 15:45 #2
SELECT * FROM dintabel ORDER BY id DESC LIMIT 1
Avatar billede gruppe_trio Nybegynder
04. marts 2003 - 15:49 #3
"SELECT * FROM dintabel ORDER BY id DESC LIMIT 1"

Får man så ikke alle rækker i tabellen? Sorteret fra højeste til laveste?
Jeg vil gerne bare ha returnert højeste ID-nummer.
Avatar billede Slettet bruger
04. marts 2003 - 15:50 #4
ved den får du den sidste række i tabellen, der kan du så udskrive dit id fra.

at du skriver LIMIT 1 gør at du kun får den ene række
Avatar billede fsconsult.dk Nybegynder
04. marts 2003 - 15:52 #5
Jeg vil gætte på at I ikke har så meget brug for at finde højeste ID i en tabel, da man normalt indsætter nye records uden at angive det felt der er AUTO_INCREMENT på, for at få MySQL til at generere dette felt.

Derimod vil I have gavn af at kalde "SELECT LAST_INSERT_ID();" umiddelbart efter en INSERT for at hente værdien af det indsatte felt.
Avatar billede bearhugx Nybegynder
04. marts 2003 - 15:52 #6
for at bygge lidt videre på questis svar

SELECT VareId
FROM VareTabel
ORDER BY VareId DESC
LIMIT 1

Så får i et resultset, som består af én post (LIMIT 1), med den højste VareId

Evt Kan i bare bruge

SELECT MAX(VareId)
FROM VareTabel
Avatar billede gruppe_trio Nybegynder
04. marts 2003 - 15:52 #7
smart  :-)

Tak skal du have.
Avatar billede gruppe_trio Nybegynder
04. marts 2003 - 15:54 #8
hov...!  Der var kommet nogen flere svar...

bearhugx >> Det var ikke meningen at afvise dig.
Avatar billede bearhugx Nybegynder
04. marts 2003 - 15:55 #9
Bemærk at forskellen på mit og questis' svar er, at jeg specifikt vælger VareId kolonnen ud - så det er ikke hele posten, men kun dette enkelte stykke data, som bliver sendt tilbage ....

Samme effekt vil
SELECT MAX(VareId) AS MaxVareId FROM VareTabel give -- Et resultsæt - med en post - en kolonne (som hedder MaxVareId), som man så kan læse fra....
Avatar billede arne_v Ekspert
04. marts 2003 - 16:09 #10
Et par kommentarer.

Pas på med SELECT ORDER BY LIMIT 1 og SELECT MAX i en
multi-uset/multi-threaded kontekst. Der er absolut ingen
garanti for at det virker der.

LAST_INSERT_ID er så vidt jeg ved MySQL specific og er derfor
ikke database uafhængig.

J2SE 1.4 java.sql.Statement har en getGeneratedKeys til at hente
dem med. Det virker kun med JDBC 3.0 compliant JDBC drivere
hvis jeg husker rigtigt. Og jeg tvivler på at MySQL JDBC
er 3.0 compliant.

De fleste vælger at generere keys i deres java kode. Det er
100% portabelt. Scott Amblers high-low approach kan bruges
til at gøre dette effektivt.
Avatar billede fsconsult.dk Nybegynder
04. marts 2003 - 16:19 #11
LAST_INSERT_ID er en MySQL opfindelse, da de endnu ikke (sidst jeg prøvede) understøtter getGeneratedKeys.

At benytte denne funktion medfører som Arne gør opmærksom på, at koden ikke umiddelbart kan flyttes til andre databaser.

Om man ønsker at generere db-keys i java koden, er ofte en afvejning om hvorvidt der er andre indgangsvinkler til databasen end java, som også skal være i stand til at generere nøgler, hvilket der så kan være en fordel at overlade problemet til databasen.
Avatar billede gruppe_trio Nybegynder
04. marts 2003 - 16:24 #12
fsconsult.dk >> Når vi tænker problemet igennem, har du nok ret. Det er bare os der ikke tænker ordentlig. Vi har faktisk heller ikke brug for LAST_INSERT_ID()

bearhugx >> Vil du have nogle points for din utdybning?

arne_v >> "De fleste vælger at generere keys i deres java kode"
Kan du forklare lidt om dette?
Avatar billede bearhugx Nybegynder
04. marts 2003 - 17:12 #13
Jeg behøver ikke nogle points - Det eneste jeg leverede var et opslag i min "SQL-bibel"

Jeg kan dog nævne at Mark Matthews (manden med en af de mest populære MySQL drivere til Java) har en en JDBC 3.0 compliant Driver... (som understøtter getGeneratedKeys() )

En anden god grund til at "opgradere" driver, hvis man stadigvæk har en 2.xx driver, er at han har fået optimeret koden, så den efter sigende skulle køre 50-100% hurtigere .... Og det er jo noget, som der batter ! :-)

Jeg smidder lige et link :-)
http://www.mysql.com/products/connector-j/index.html
Avatar billede arne_v Ekspert
04. marts 2003 - 17:20 #14
Det er et ret generelt problem at skulle gemme data
under unikke keys.

Forskellige databaser har forskellige måder at løse det på.

Hvis man vil være database uafhængig vælger man derfor ofte
at generere keys selv.

D.v.s. man erlærer vare et normalt felt i databasen og
så laver man en key generator som genererer unikke keys
i sin kode.

Som en lille positiv side-gevindst har man ingen problemer
med at vide havd keyen er, fordi den gemmer man jo bareog
kan bruge som foreign key når man gemmer i andre tabeller.

Tricket er selvfølgelig at få en unik key, men det problem
er der som sagt fundet løsninger på.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester