25. april 2007 - 22:09Der er
15 kommentarer og 1 løsning
Varenummer ud fra ID felt problem
Jeg har lavet et system hvor varenummeret på varer der bliver oprettet får et fortløbende nummer påsat så det eksempelvis kommer til at hedder arm22. Dette sker ved at finde det største id nummer og lægge en til.
Dette skulle sikre, at hvert nummer bliver unikt, men der opstår jo selvfølgelig et problem, hvis varen med det største id nummer i tabellen bliver slettet. Så får den næste vare man opretter samme varenummer som den vare der lige er blevet slettet.
Hvad er en god måde at slippe rundt om dette på? Jeg har overvejet om jeg skal til at lave endnu en tabel, hvor hvert id nummer bliver gemt til, og hvor de ikke kan slettes fra, da dette nok kunne løse mit problem, men er der andre måder?
"Så får den næste vare man opretter samme varenummer som den vare der lige er blevet slettet." -- Nej, det skulle det ikke hvis du benytter en database.
Databaser har normal typisk mulighed for auto increment på et IDENTITY field. I MySQL er det bare at tilføje auto increment på din primary key. I MSSQL skal du sætte IDENTITY på din primary key.
Denne auto increment er så gemt, og stiger altid een i forhold til sidste gang den indsatte en, ikke i forhold til værdien af sidste række i tabellen.
Hvis du manuelt gør auto increment, skal du nok have skrevet en del af din kode om ;-)
Og en anden idé er at lade være med at slette varerne, men blot markere med et felt om de er aktive eller ej. En sletning ville så være: UPDATE varelager SET aktiv=0 WHERE id='arm22' Varer du viser skal have aktiv=1 - men du finder max ud fra dem alle.
Men når det er sagt, så er IDENTITY/autoincrement nok en bedre idé.
Der er autoincrement sat på id feltet, men fordi den læser id feltet inden den skriver en ny værdi, så oplever jeg det problem jeg beskrev ovenfor.
Erikjacobsen, det lyder som en løsning, det med at deaktivere varerne i stedet for at slette dem. Det havde også også tænkt på, men tænkte at det måske kunne gå ud over hastigheden på søgninger i databasen. Men det er vel lige meget, medmindre der er tale om en kæmpestor database.
"Der er autoincrement sat på id feltet, men fordi den læser id feltet inden den skriver en ny værdi, så oplever jeg det problem jeg beskrev ovenfor." -- Hvorfor gør den det ?
Men det er jo egentlig fordi jeg har sat systemet til at vise det varenummer, som varen får, inden man opretter varen. Det bliver vist i et readonly tekstfelt.
// FIND NÆSTE AUTOINCREMENT $fields = mysql_query("SHOW TABLE STATUS FROM `database`"); while($f = mysql_fetch_assoc($fields)) { if($f["Name"] != "tabelnavn") { // tabel hvor næste nr skal findes continue; } $nextid = $f["Auto_increment"]; }
mysql_free_result($fields);
$nextid er næste tal ved insert. Om der findes en enklere måde, ved jeg ikke?
"Men det er jo egentlig fordi jeg har sat systemet til at vise det varenummer, som varen får, inden man opretter varen. Det bliver vist i et readonly tekstfelt." Så er du også ude på balade :p
Du skal jo bare bruge SQL til at fetche AUTO_INCREMENT værdien , og så vise den +1. Så bliver det:
1) Oprette den nye vare 2) Indsætte nyt produkt i databasen, og lad systemet håntere AUTO_INCREMENT.
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.