Avatar billede burningice Nybegynder
21. januar 2003 - 17:55 Der 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.

Hvordan gør man, og hvordan gør i andre?
21. januar 2003 - 17:58 #1
Brug autonummerering.

Når du på et tidspunkt skal skifte til MS SQL renummererer du id-feltet.
Avatar billede burningice Nybegynder
21. januar 2003 - 18:00 #2
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.
21. januar 2003 - 18:03 #3
Hvorfor så ikke bare beholde værdierne.

Hvad er problemet?
Avatar billede mugs Novice
21. januar 2003 - 18:05 #4
Bruger du autonummerering har du ingen mulighed for at genbruge numrer.
Du kan evt. bruge funktioen DMax + 1
Avatar billede burningice Nybegynder
21. januar 2003 - 18:07 #5
erikjuul>> læs nu mit spm !!

lad os sige jeg har følgende kunder

1
2
3
4
5
6
7

nu sletter jeg tre af dem så id'erne bliver

1
2
5
7

hvis jeg nu vil eksportere det til en sql database, så vil id'erne blive

1
2
3
4

altså... mangler 5 og 7, fordi at databaen, i og med det er autonummerering, automatisk tildeler et id, right? eller er jeg helt galt på den?
Avatar billede burningice Nybegynder
21. januar 2003 - 18:18 #6
jeg har lige hurtigt testet det (igen) for at være 100% sikker på min sag ;)

følgende kunder blev copy/pastet over i en ny tabel

111
122
132
133
135
136

og vupti, nu var id'erne pludselig

1
2
3
4
5
6
21. januar 2003 - 18:18 #7
De ændres ikke ved en eksport
Avatar billede burningice Nybegynder
21. januar 2003 - 18:28 #8
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.
Avatar billede _darkstar_ Nybegynder
21. januar 2003 - 18:37 #9
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.
Avatar billede burningice Nybegynder
21. januar 2003 - 18:41 #10
_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.
Avatar billede nih Novice
21. januar 2003 - 20:35 #11
din tabel bør have et autonummering som primærnøgle - Så kan du have kundenr i et felt ved siden af.
Kunder: ID, kundeNr, osv.......

internt i databasen er relationerne til ID - så sker der ikke noget ved at ændre kundenumre.

Niels
Avatar billede burningice Nybegynder
21. januar 2003 - 20:48 #12
nih>> det er selvfølgelig rigtigt... det var også en mulighed :)

jeg har dog tænkt på en ting... jeg har dog ikke rigtig fået det til at virke, så det er nok fordi at man ikke kan... men hvad med nested sql?

altså: INSERT INTO tblKunder (id) VALUES ((SELECT MAX(id) FROM tblKunder) + 1

det er ikke muligt?
Avatar billede nih Novice
21. januar 2003 - 22:17 #13
INSERT INTO tblKunder (id)
values( DMax("[id]","tblKunder") )
Avatar billede nih Novice
21. januar 2003 - 22:18 #14
INSERT INTO tblKunder (id)
values( DMax("[id]","tblKunder") + 1 )

+1 selvfølgelig :o)
Avatar billede nih Novice
21. januar 2003 - 22:21 #15
Eller

INSERT INTO tblKunder (id) VALUES (SELECT MAX(id) + 1 FROM tblKunder)
Avatar billede burningice Nybegynder
21. januar 2003 - 23:30 #16
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 :)
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