Avatar billede shanse29 Nybegynder
12. juni 2001 - 23:29 Der er 10 kommentarer og
1 løsning

Udtræk af næste id fra colonne med autonummering...

Ved nogen hvordan man kan suge det næste id i en colonne med autonummering. Jeg skal bruge det i forbindelse med en insert-ting.

Har forsøgt at med:

SQL = \"SELECT id FROM medarbejder order by id DESC\"
Dim nextId
nextId = objRec(\"id\")+1

Men hvis der i mellemtiden er slettet nogle rækker i ens tabel får jeg ikke det næste id, men blot det højeste der er indsat i colonnen (+1). Jeg skal bruge det næste id Acces vil indsætte.
Avatar billede henrik_ffc Nybegynder
12. juni 2001 - 23:47 #1
Jeg tror ikke der findes nogen måde at forudse et auto-id
Jeg kender kun til PHP+MySQL, men her ville jeg gøre således:

insert into medarbejdere (id) values (null);
$id = mysql_insert_id(); // $id indeholder seneste indsatte autonummer.

Nu kender du id og kan bruge det til whatever du skal bruge det til.
Senere kan du tilføje resten af felterne med

update table medarbejdere set navn=$navn, adresse=$adresse where id=$id

Avatar billede shanse29 Nybegynder
12. juni 2001 - 23:50 #2
Hej Henrik
Tak for dit svar - men jeg har fundet en løsning på det!.
Du har nok ret i at man ikke kan forud se et auto-id.
/shanse
Avatar billede burningice Nybegynder
13. juni 2001 - 02:44 #3
uhm... hvad med

set rs = conn.execute(\"SELECT id FROM medarbejder order by id DESC\")

maxid = rs(\"id\")
rs.movenext
nextid = rs(\"id\")

set rs = nothing
Avatar billede henrik_ffc Nybegynder
13. juni 2001 - 12:02 #4
Hvad sker der så her:

insert into medarbejder values (1, \"hkjd\", \"jkdsjf\",,,);
insert into medarbejder values (2, \"hkjd\", \"jkdsjf\",,,);
insert into medarbejder values (3, \"hkjd\", \"jkdsjf\",,,);
insert into medarbejder values (4, \"hkjd\", \"jkdsjf\",,,);

delete from medarbejder where id > 2;


Og her dit forslag:
set rs = conn.execute(\"SELECT id FROM medarbejder order by id DESC\")

maxid = rs(\"id\")
rs.movenext
nextid = rs(\"id\")


Hvad ville nextid nu indeholde?
3 siger du???
Men næste autoid ville være 5, selvom 3 og 4 ikke længere eksisterer!
Avatar billede henrik_ffc Nybegynder
13. juni 2001 - 12:07 #5
I øvrigt er
  select max(id) from medarbejdere
nok en DEL hurtigere end
  SELECT id FROM medarbejder order by id DESC
specielt ved store tabeller
Avatar billede burningice Nybegynder
13. juni 2001 - 20:51 #6
henrik_ffc>> ved select max(id) vælger du KUN den højeste record og du kan derfor ikke forudsige hvad den næste i rækken vil være... dog kan man nok sige seslect top 2 id from medarbejder order by id desc, på den måde får du det højeste og næst højeste, nu burde det jo ikke være så svært at finde det næste id!
Avatar billede henrik_ffc Nybegynder
13. juni 2001 - 22:07 #7
Cyberfessor>>
Du taler nonsens.
Hvis du trækker ALLE ID\'s ud og de fx er
1, 2, 3, 6, 8 hvad er så det næste??
Man kan GÆTTE på det er 9, men det er langt fra sikkert. Det kunne være 12 eller 15 istedet, hvis de mellemliggende tilfældigvis er blevet slettet.
Derfor er \"select max(id)\" præcis ligeså god (eller dårlig) som \"select ALT\"
MEN select max(id) er langt hurtigere, da der kun skal hentes et enkelt tal...

Men pointen er at ingen af metoderne kan garantere, hvad næste id er, før
der er indsat i tabellen.
Avatar billede burningice Nybegynder
14. juni 2001 - 05:52 #8
hey hey, du så åbenbart ikke min select top 2 id, på den måde får man måske 9, 5... du ved at 9 er det højeste, og derfor må 5 være det næste...
Avatar billede henrik_ffc Nybegynder
14. juni 2001 - 09:28 #9
cyberfessor>>
Hør lige her engang.

Næste id kan da aldrig være mindre end de

Et auto id vokser altid opad med 1 hver gang der indsættes en ny tupel.
Når du har indsat id = 1, 2, 3, 4, 5

ID  DATA
1  xxx
2  yyy
3  xxx
4  qqq
5  www

og derefter sletter 3, 4, 5

ID  DATA
1  xxx
2  yyy

vil næste id alligevel være 6 selvom der kun eksisterer id=1 og 2

ID  DATA
1  xxx
2  yyy
6  ccc

Det har derfor INGEN effekt at hente de sidste to (her id=1 og 2)
for du kan ikke vide hvad næste id vil være.

Bemærk at spørgsmålet gik på *næste* id, ikke næststørste.
Hvad skulle man også bruge det til???


Min forslag til løsning var at indsætte en tom linie,
undersøge hvilket id linie fik, bruge dette id til hvad
det nu skal bruges til og derefter ændre indholdet af linien med
  update Medarbejder set xxx=qqq, yyy=zzz where id=www
Avatar billede henrik_ffc Nybegynder
14. juni 2001 - 09:29 #10
Næste id kan da aldrig være mindre end de
skulle være
Næste id kan da aldrig være mindre end det højeste id
Avatar billede burningice Nybegynder
14. juni 2001 - 15:49 #11
sorry, havde forstået det som næste id i den anden retning, men det er rigtigt... hvis det er en record som ikke findes (endnu) bliver det lidt svært!
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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