Avatar billede martinsorensen Nybegynder
04. maj 2008 - 16:57 Der er 8 kommentarer og
1 løsning

row id - problemer med slet row.

Hej eksperter.

Jeg har en database hvor jeg har en kolonne, nyhed_id, som er primary key. Hver gang jeg så opretter en nyhed bliver den lagt ind som en row, og nyhed_id bliver samtidigt lagt ind som én større en den forrige. DVS, hvis jeg opretter en nyhed, og der var 10 nyheder før, så bliver denne nyhed døbt nyhed_id nummer 11. Dette gør jeg ved hjælp af at tælle antallet af rows ved hjælp af COUNT funktionen.

SELECT COUNT(nyhed_id) FROM nyheder

det bliver lagt i en INT+1, og det tal, som er én større end antallet af kolonner nyhed_id, bliver lagt ind sammen med den nye nyhed/row. Dette virker også fint, hvis man ikke sletter nogle rows, medmindre det er den sidst indlagte nyhed.For hvis jeg sletter en nyhed som ikke er den sidste vil det fejel. Eks.

Der er 10 nyheder. Jeg sletter nyhed nummer 3. Nu er der i alt 9 nyheder, 1,2,4,5,6,7,8,9 og 10. Hvis jeg så laver en ny nyhed, da vil den tælle antallet af rows = 9. Og den nye nyhed vil få nyhed_id = 10. Problemet kommer så her fordi at nyhed_id er primary key not null. Så der kan ikke være 2 af samme værdi.

Mit spørgsmål er så om der er en nemmere metode til at lave dette trick på? Lige nu køre jeg en metode der tjekker hver værdi i kolonnen nyhed_id, og hvis der er mere en +1 op til den næste værdi rettes denne og resten deropaf. Dette bliver imidlertidigt noget tungt at køre når der er mange nyheder. Håber i har en god idé / ved mere end mig på dette punkt! :D

På forhånd tak!

Mvh

Martin
Avatar billede arne_v Ekspert
04. maj 2008 - 17:00 #1
Du kunne bruge SELECT MAX fremfor SELECT COUNT.

Men glem det. Hele metoden er dybt forkert.

Brug en identity column i stedet for og lad SQLServer håndtere det hele.
Avatar billede HenrikSjang Nybegynder
04. maj 2008 - 17:12 #2
Jeg er enig med arne v, lav en identiy column - så slipper du selv for at holde styr på id'erne.

ALTER TABLE dinTabel
ADD newIdColumn INT IDENTITY (1,1)

Dette udfylder automatisk nye id'er i kolonnen, så hvis du har nogle relationstabeller, vil du manuelt skulle opdatere disse bagefter.
Avatar billede martinsorensen Nybegynder
04. maj 2008 - 17:17 #3
Jep, tænkte nok at der var en indbygget funktion til dette. Vil læse lidt om det så, men vidste ikke lige hvad det hed. Men identity column vil jeg bruge så! :) smid et svar. :)
Avatar billede martinsorensen Nybegynder
04. maj 2008 - 17:19 #4
her i evt et link til hvor man kan læse om dette :)
Avatar billede HenrikSjang Nybegynder
04. maj 2008 - 17:25 #5
Her står noget ret fornuftigt om emnet:
http://www.sqlteam.com/article/understanding-identity-columns

Jeg lader lige arne smide svaret, da han jo kom først :)
Avatar billede arne_v Ekspert
04. maj 2008 - 17:28 #6
svar
Avatar billede martinsorensen Nybegynder
04. maj 2008 - 17:30 #7
ok, så har jeg fundet ud af det. Og har lige et sidste spørsmål. Har i en smart metode til at får de 3 seneste rows som er lagt ind i DB frem?
Avatar billede martinsorensen Nybegynder
04. maj 2008 - 17:33 #8
for lige nu, hvis jeg sletter en i midten, da giver identify bare den næste et nummer +1. Så hvis jeg sletter én i midten vil der stå f.eks 1,3,4,7,9 osv. Hvordan kan jeg lave en metode som tager de 3 rows som har de største værdier af identify? :)
Avatar billede arne_v Ekspert
04. maj 2008 - 17:42 #9
SELECT TOP 3 * FROM tabel ORDER BY id DESC
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