Avatar billede kledal Nybegynder
20. november 2002 - 14:47 Der er 11 kommentarer og
1 løsning

problem med autonummer i tabel

har i en tabel ID til autonummerering, problemet er at når jeg sletter et Id på F.eks 12 og det højeste derefter er 11 så tildeles det næste ID automatisk 13!! hvorfor det?? Det skal give nummeret der er et højere, det er meget vigtigt. Kan man eventuelt flushe tabellen (hvad gør en flush egentlig?) eller hvad?? hvad kan man gøre for at få DB'en til at hente nummeret der kun er en højere end det sidst givne ID??

mvh kledal
Avatar billede bennytordrup Nybegynder
20. november 2002 - 14:49 #1
Hvis det er den funktionalitet, så skal du ikke bruge autonummerering. I stedet skal du manuelt tildele værdien via en select max(TabelID)+1.
Avatar billede ocp Nybegynder
20. november 2002 - 15:07 #2
Ved delete skal du lige lave:

Update tabel set nrfelt = nrfelt - 1
where nrfelt > @slettetnr
Avatar billede arne_v Ekspert
20. november 2002 - 15:16 #3
Database har det med at holde styr på de autoincrement
felter og opdatere dem udfra deres interne info.

Jeg har set det samme i Access.

Men hvorfor er det et problem ?

Skal du ikke bare have en unik nøgle ?

Hvis du virkeligt vil have dem fortløbende så kan
du bruge de 2 forrige svar.

MEN du skal have styr på dine transaktioner ellers
så kan det gå meget galt med simultane opdateringer.
Avatar billede bennytordrup Nybegynder
20. november 2002 - 15:18 #4
Ideen med et autonummereringsfelt er, at det altid er unikt, så det kan bruges som fremmednøgle i andre tabeller.

Hvad er begrundelsen for, at der skal tildeles en højere end det sidst brugte?
Avatar billede kledal Nybegynder
20. november 2002 - 15:32 #5
grunden er at jeg skal kunne håndtere flere brugere der samtiddig opdatere samme felt i min database, kun første bruger skal have lov, anden skal have fejl!
Jeg bruger autonemmerering for netop at undgå at der kommer flere ID der er identiske, hvilket der gør ved max(tabelID)+1 metoden, da de 2 brugere samtiddig skriver til databasen. men hvis man laver autonummerering, kommer der altdi et unikt ID, hvilket jeg bagefter gerne vil chekke om med nummeret af Id's der var lige inden de opdaterede, og hvis det så er højere end 1, så nægter jeg opdateringen. Hvad gør en Flush table funktion?? kan det ikke resette de interne info i DB'en så den altid vælger det højeste ID og tildeler en højere??

mvh kledal
Avatar billede bennytordrup Nybegynder
20. november 2002 - 15:34 #6
Er det samme felt på samme post, de vil opdatere samtidig? Eller er det samme felt i forskellige poster?
Avatar billede arne_v Ekspert
20. november 2002 - 15:41 #7
select max(TabelID)+1 og insert kan godt løse problemet,
hvis men også kun hvis tabellen er låst mellem de 2
statements.
Avatar billede kledal Nybegynder
20. november 2002 - 15:58 #8
jeg låser tabellen og det virker stadig ikke!

Og det er alle felterne i samme tabel, der skal opdateres!
Det handler om nogle rapporter, som har et versionsnummer (det er dette der skal stige med 1) og de har en ID, denne er ikke unik. Når rapporten bliver opdateret, bliver foregående versionsnummer, sat til 'tidligere' i status-feltet, og der indsættes en ny rapport med samme ID, og et versionsnummer der er en højere end foregående version. Når 2 brugere gør dette samtiddig, oprettes der 2 rapporter med samme versionsnummer. For at omgå dette oprettede jeg et nyt felt (ekstra_id) dette er autonummereret, og jeg tjekker så om det ekstra_id nummer brugerne har med når de skal ind og oprette en ny rapport, er mere end 1 lavere end det nye nummer som DB'en automatisk giver dem er. Hvis det er det, slettes den post de netop har indsat i DB'en igen, men dette giver det problem at autonummereringen allerede har brugt det nummer som er en gang større en gang før. Og næste gang sættes det blot en højere end sidst. Derfor vil jeg høre om man kan FLUSHE Tabellen og hvad denne funktion gør!!

for jeg skal på en eller anden måde resette DB'en.

håber dette er forståeligt nok :-)
mvh kledal
Avatar billede arne_v Ekspert
20. november 2002 - 16:47 #9
Hvis tabellen er låst hvordan kan det så gå galt ?

Jeg tror du har forkert transaction isolation level
i databasen !
Avatar billede kledal Nybegynder
21. november 2002 - 10:42 #10
fordi når tabellen er låst, så venter den bare med at indsætte den næste værdi!
Avatar billede ocp Nybegynder
21. november 2002 - 11:01 #11
Jeg foreslår en insert trigger der automatisk finder max og sætter den nye version til max+1. På den måde behøver du ikke låse databasen.
Avatar billede kledal Nybegynder
21. november 2002 - 13:32 #12
jeg har gjort det på en anden måde.
har omgået det ved kun at tillade en bruger at redigere i en rapport ad gangen!
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