21. januar 2003 - 17:55Der er
15 kommentarer og 1 løsning
Manuel autonummerering
Jeg har fået strikket en database sammen, som skal bruges i forbindelse med en butik, hvor de enkelte kunder gemmes i en tabel, og de ting en kunde har købt i en anden. Begge tabeller har et id-felt som har datatypen autonummerering. Jeg er dog stødt ind i et mindre problem.
Det er muligt at slette en kunde, og tilhørende ting kunden har købt, og på den måde opstår der et "hul" i rækken af id'er. Dvs. at når der engang skal skiftes db til f.eks. MS SQL, så mister jeg integriteten med id'erne, da jeg ikke selv har mulighed for at definere de id'er der skal stå i databasen. Det var faktisk en navision-mand der gjorde mig opmærksom på "problemet" og fraråede at bruge autonummerering alle de steder hvor integritet var vigtig, så det jeg søger er altså en smart måde hvorpå jeg selv kan vælge hvilket id en kunde skal have.
Jeg har prøvet med "INSERT INTO tblKunder (id, navn) VALUES (MAX(id)+1, 'bummelum')" men får fejlen Cannot use aggreate functions in SQL-statements.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
erikjuul>> renummererer?? problemet opstår jo, som jeg ser det, når en kunde skifter id fra f.eks. 230 til 215... så vil alle varerne der står i tabellen tblKundeLinjer referer til den forkerte kunde, altså stadigvæk 230, som jo nu har nummeret 215.
erikjull> well... det gør der jo så... du behøver forresten ikke at besvære dig med at blive ved med at svare... du har svaret en gang, så må det være nok.
så længe der er autonummering bliver id'erne automatisk tildelt, og det er det jeg vil ud over, så jeg ikke pludselig mister integriteten fordi at min databse pludselig autonummererer forkert.
Du er nødt til at lade være med at bruge autonummerering, med mindre at du kan slå det fra når du indlæser data (det burde man så til gengæld kunne gøre).
Hvis du slår det fra, skal du lave en transaktion, hvor du først kører:
SELECT MAX(id)+1 FROM tblKunder
og derefter
INSERT INTO tblKunder (id, navn) VALUES (<det nye id>, 'bummelum')
Hvis du kører det som en transaktion, kan du være sikker på at andre programmer ikke får mulighed for at indsætte rækker før at ovenstående er kørt færdig.
_darkstar_>>... okay, altså skal der laves to kald til databasen... jeg havde håbet at der var noget smart der kunne gøre det ud i et, men har godt nok ikke rigtig kunne finde noget på nettet heller.
nih>> se, DET var jo noget jeg kunne bruge til noget :)
INSERT INTO tblKunder (id) values( DMax("[id]","tblKunder") + 1 )
Ser ud til at virke superb !! hvis ingen har flere kommentarer, eller indvendinger til hvorfor jeg evt. ikke skulle bruge hans løsning, så bliver det den :) evt. i en kombination med hans andet forslag :)
Synes godt om
Ny brugerNybegynder
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.