Gå til innhold

Hente ledige tall midt inne i rekkefølge


Anbefalte innlegg

Har en database som kan ha IDer i tilfeldig rekkefølge.

Jeg kan da ha en tabell med følgende IDer

 

1

2

3

5

6

7

8

9

11

13

14

15

16

[...]

 

Finnes det noen enkel spørring for å finne første ledige ID? I dette tilfellet "4", og som neste gang da returnerer "10"?

Jeg kan selvfølgelig lage dette i kode ved å gå gjennom alle rader og finne første ledige, men dette føles ganske ressurskrevende i forhold til å kanskje kunne klare seg med én eller to spørringer.

 

Hvis det hjelper har jeg koblet Entity Framework (.Net) mot databasen.

Lenke til kommentar
Videoannonse
Annonse

Først og fremst: Hvorfor vil du gjøre dette?

 

Hvis dette er Primary Key i databasen så bør du virkelig la databasen selv generere Id. Det er ingen grunn til at det skal være sekvensiell rekkefølge på Id, og koden bør ikke bry seg.

 

Hvis du selv trenger en sekvensiell liste (eller sortering f.eks) så bør du legge til et felt i modellen og gjøre en migration. 

 

Videre er det stor forskjell på om algoritmen som eventuelt skulle lages her MÅ svare 4 og så 10 så 12, eller om det er OK at den svarer en av de tre, f.eks 10, 4, 12. Førstnevnte vil ha en worst case kjøretid på N (hvor N er antall rader i tabellen din) ettersom den MÅ gå igjennom alle for å verifisere at N+1 er neste Id (worst case). Den andre varianten hvor 10,4,12 er OK vil ha en worst case kjøretid på log(N)så f.eks om du har 1000 rader så vil algoritme 1 i værste fall måtte søke alle 1000 for å finne løsningen. Men algoritme 2 finner en løsning på 10 søkesteg.

Vet ikke om jeg klarer å forklare meg her men...

Lenke til kommentar

Dette er en tabell med oversikt over produkter, og ID'feltet er produktkoden. Hvis et produkt blir slettet så blir det et ledig element midt i som jeg da ønsker å bruke til et nytt produkt. Det har også blitt importert data fra et annet system hvor det er mange ledige hull i produktkodene.

Som standard brukes selvfølgelig neste ledige høyeste ID, men jeg ønsker også å ha muligheten til å finne en ID som er midt i.

Hvordan ville du laget den andre varianten?

Lenke til kommentar
Gjest medlem-135366

Har en database som kan ha IDer i tilfeldig rekkefølge.

Jeg kan da ha en tabell med følgende IDer

 

1

2

3

5

6

7

8

9

11

13

14

15

16

[...]

 

Finnes det noen enkel spørring for å finne første ledige ID? I dette tilfellet "4", og som neste gang da returnerer "10"?

Jeg kan selvfølgelig lage dette i kode ved å gå gjennom alle rader og finne første ledige, men dette føles ganske ressurskrevende i forhold til å kanskje kunne klare seg med én eller to spørringer.

 

Hvis det hjelper har jeg koblet Entity Framework (.Net) mot databasen.

Det finnes jo flere SQL dialekt varianter. Vanlig SQL har sine begrensninger, men det er fullt mulig. Noen SQL varianter har utvidelser som gjør det mer likt et programmeringsspråk. Selvsagt kan man diskutere om dette er nødvendig, men jeg synes likevel for kunnskapens skyld at slike ting bør læres. Lurt av deg uansett å kunne dette uavhengig om det er smart eller ikke. Man kan lære mye av å gjøre tungvinte ting. Nettet har jo mange eksempler for å løse dette:

Her noen linker:

http://stackoverflow.com/questions/174532/how-to-find-holes-in-a-table

http://stackoverflow.com/questions/684106/find-the-smallest-unused-number-in-sql-server

Lenke til kommentar

Nå skal ikke jeg ta opp dette mer enn en gang, men hvis du faktisk selger noe bør du ikke slette det med hensyn på historikk. Mye bedre da å heller ha et disabled eller out_of_stock.

En produktkode bør peke til et produkt, ikke til en ledig plass i lageret ditt :)

 

Hvis jeg var deg ville jeg skilt mellom databasens PK og din egen produktkode. Det gjør også endring av koden litt mer trivelig.

 

 

Mine 2 bits (vel, ble en del mer enn det da...)

  • Liker 1
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...