Avatar billede river_rage Nybegynder
25. april 2007 - 22:09 Der 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?
Avatar billede windcape Praktikant
25. april 2007 - 22:17 #1
"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 ;-)
Avatar billede erikjacobsen Ekspert
25. april 2007 - 22:27 #2
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é.
Avatar billede river_rage Nybegynder
25. april 2007 - 22:52 #3
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.
Avatar billede windcape Praktikant
25. april 2007 - 22:55 #4
"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 ?
Avatar billede river_rage Nybegynder
25. april 2007 - 23:02 #5
Måske fordi jeg ikke har så meget erfaring med php ;)

Det kan godt ske, at jeg bare skal:

1. oprette den nye vare uden varenr.
2. læse id-feltets værdi.
3. skrive varenummeret ind i tabellen.

Lyder der fornuftigt?
Avatar billede river_rage Nybegynder
25. april 2007 - 23:31 #6
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.
Avatar billede showsource Seniormester
25. april 2007 - 23:44 #7
Til at få vist næste nr i et autoincrement felt:

// 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 du bør nok ændre din opbygning i stedet.
Avatar billede windcape Praktikant
25. april 2007 - 23:46 #8
"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.
Avatar billede windcape Praktikant
25. april 2007 - 23:50 #9
"Om der findes en enklere måde, ved jeg ikke?"

SELECT
    AUTO_INCREMENT
FROM
    information_schema.TABLES
WHERE
    TABLE_SCHEMA = 'database'
AND
    TABLE_NAME = 'table'
Avatar billede windcape Praktikant
25. april 2007 - 23:52 #10
Og det var ren SQL. Sandsyneligheden for at det giver den rigtige værdi afhænger af hvor mange brugere du har på systemet samtidigt.

Normalt ville det også være mere normalt at vise order nummeret BAGEFTER, hvilket i php kan gøres med mysql_insert_id()
Avatar billede windcape Praktikant
25. april 2007 - 23:53 #11
btw. showsource.. du må godt bruge WHERE :-)

"SHOW TABLE STATUS FROM `database` WHERE `Name` = 'tabelnavn'"
Avatar billede showsource Seniormester
26. april 2007 - 00:32 #12
jamen jamen :O)
Avatar billede yHec Novice
26. april 2007 - 17:26 #13
Du kunne også kigge på denne her:
http://dk2.php.net/manual/da/function.mysqli-insert-id.php
Den finder det id der blev indsat i sidste query... Også lægger du bare en til også skulle det passe.

/y
Avatar billede windcape Praktikant
27. april 2007 - 00:25 #14
y

Læs spørgsmålet :-) og du vil forstå hvorfor det ikke er nok til spørgeren.
Avatar billede windcape Praktikant
27. april 2007 - 00:25 #15
og desuden kræver den funktion at du kører et query først.
Avatar billede river_rage Nybegynder
21. april 2010 - 11:59 #16
Lukker denne tråd, da den er 3 år gammel
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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