Avatar billede websam Nybegynder
23. februar 2007 - 09:10 Der er 20 kommentarer og
1 løsning

Finde næste autogenereret id ?

Hejsa,

Jeg sidder med et lille projekt hvor jeg har behov for at kunne finde det næste auto genereret nummer inden der indsættes en record i databasen.

Er dette muligt uden der indsættes en record ?

/websam
Avatar billede coderdk Praktikant
23. februar 2007 - 09:17 #1
Hvorfor skal du bruge det? Det er næsten *altid* tilfældet at det kan laves på en bedre måde ;)
Avatar billede coderdk Praktikant
23. februar 2007 - 09:18 #2
Du kan evt. bruge en temporær tabel med en auto_increment, og rent faktisk indsætte en record og hente værdien med insert_id() - Når du så skal gemme den rigtigt indsætter du bare denne id ind i den rigtige tabel...
Avatar billede websam Nybegynder
23. februar 2007 - 09:26 #3
Det er fordi jeg er ved at lave et system til indkøb af vare som skal snakke sammen med C5. Her bliver en bruger præsenteret for en liste med vare der skal indkøbes, når denne så ringer til leverandøren skal jeg forud kunne vise en indkøbs id inden selve indkøbet foretages og dermed er der ikke oprettet nogle records ;o)

/Websam
Avatar billede fennec Nybegynder
23. februar 2007 - 09:34 #4
Den skal jeg lige have igen...

Det er altså den liste med vare, som skal indkøbes, der skal have et ID. Og når man har snakket med leverandøren, bliver der oprette en indkøbsordre (som så skal have det omtalte ID). Er det rigtig opfattet?
Avatar billede coderdk Praktikant
23. februar 2007 - 09:36 #5
Hvorfor ikke oprette det og have et flag (tinyint) til at angive om ordren er afgivet?
Avatar billede websam Nybegynder
23. februar 2007 - 09:45 #6
fennec >> ja det er korrekt

coderdk >> fordi hvis det oprettes og ikke bruges, så får jeg for mange huller i id'et
Avatar billede coderdk Praktikant
23. februar 2007 - 09:52 #7
Huller i ID'erne? Er det ikke totalt ligegyldigt om der er huller eller ej? Det burde det da være ;)
Avatar billede whatever Nybegynder
24. februar 2007 - 11:36 #8
Er det et flerbruger system, eller er der kun en der opretter indkøb?
Avatar billede fennec Nybegynder
26. februar 2007 - 09:52 #9
Et par spørgsmål:

1. Kan der være flere indkøbslister af gangen eller kun en?
2. Hvis flere, bliver de så nødvendigvis til ordre i samme rækkefølge, som de blev til lister?
3. Kan en liste bliver til flere forskellige ordre?
4. Er det kun når man snakker med lev at man til sidst skal kunne oplyse et ordreID til dem, så de har en refference af en slags?

Løsninger afhængig af svar på tidligere:
Som coderdk forslog, med et flag i tabellen, som fortæller at det er en ordre eller liste.

Arbejde med to ID'er. Et listeID og ordreID. På ordren vil man så kunne se hvilken listeID, den er lavet ud fra.

Knap som viser forventet ID (men det er ikke nødvendigvis det ID som bliver tildelt).

Funktionalitet som gør, at når man begynder på at lave en liste til en ordre (ringer til lev), bliver listen til en ordre automatisk, også modificere/redigere man ordren mens man snakker med lev.

Dette er kun et par af de senarier jeg kan se, men de afhænger af arbejdsmetoden. Andre arbejdsrutiner vil resultere i andre løsninger.
Avatar billede showsource Seniormester
29. marts 2007 - 09:08 #10
For at finde næste id:

$fields = mysql_query("SHOW TABLE STATUS FROM `din_db`");

    while($f = mysql_fetch_assoc($fields)) {
        if($f["Name"] != "tabelnavn") {
        continue;
        }
    $nextid = $f["Auto_increment"];
    }

mysql_free_result($fields);

echo $nextid;
Avatar billede websam Nybegynder
29. marts 2007 - 16:21 #11
Denne tråd har jeg helt glemt og jeg løste det med :

Select last_insert_id As lastId

Det virker ganske fint da det er inde i et loop jeg henter den så det har ingen betyninng om der så er flere på systemet af gangen.

Så på med et svar til dem af jer der vil have lidt point ;o)
Avatar billede coderdk Praktikant
29. marts 2007 - 16:56 #12
Ok, du ved godt du kan lave:

$id = mysql_insert_id();

;)
Avatar billede coderdk Praktikant
29. marts 2007 - 16:56 #13
(Som var den jeg hentydede til i 2. kommentar)
Avatar billede websam Nybegynder
29. marts 2007 - 21:04 #14
Nej det var jeg ikke klar over da jeg for det meste benytter Ms-Sql og coder i vb/c# ligger det mere lige for at benytte den, men tak for oplysningen ;o)

Og smid så et svar ;o)
Avatar billede coderdk Praktikant
29. marts 2007 - 21:12 #15
Eerh, SELECT last_insert_id virker ikke i MSSQL ;) Der bruger man SELECT @@IDENTITY ;)
Avatar billede arne_v Ekspert
29. marts 2007 - 21:24 #16
eller SELECT SCOPE_IDENTITY()
Avatar billede coderdk Praktikant
29. marts 2007 - 21:30 #17
eller SELECT IDENT_CURRENT('tabelnavn')

:) Den mest almindelige er @@IDENTITY
Avatar billede arne_v Ekspert
29. marts 2007 - 21:41 #18
SELECT IDENT_CURRENT('tabelnavn') goer noget helt andet end de andre

@@IDENTITY er nok den mest almindelige, men det er primaert fordi at den
ogsaa virker i Access, Sybase og aeldre versioner af MS SQLServer, men er man
paa en rimelig ny MS SQLServer (2000 eller 2005) er SCOPE_IDENTY() med stor
sandsynlighed hvad man vil foretraekke (forskellen paa SCOPE_IDENTY() og @@IDENTITY
er meget lille, men er der forskel vil man helst have SCOPE_IDENTY())

bruger selv ofte @@IDENTITY men SQLServer 6.5 og 7.0 er ved at vaere lidt sjaeldne ...
Avatar billede showsource Seniormester
30. marts 2007 - 07:57 #19
LAST_INSERT_ID()
er vel den rigtige her?

$lastid = mysql_result(mysql_query("SELECT LAST_INSERT_ID()"), 0);

( Nu når den jo hentes ved INSERT )
Avatar billede arne_v Ekspert
30. marts 2007 - 14:11 #20
MySQL bruger LAST_INSERT_ID()

du kan også bruge 29/03-2007 16:56:10 i PHP
Avatar billede websam Nybegynder
30. marts 2007 - 15:50 #21
rolig nu guy's jeg er helt med på ms-sql ;o)

Point på vej
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
Computerworld tilbyder specialiserede kurser i database-management

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