webForumDet fria alternativet

Slumpa unikt 6-siffrigt nummer

Databaser & SQLur Databashanterare & SQL

10 svar · 2 352 visningar · startad av Troxy

Medlem sedan mars 20041 505 inlägg
Frågan#1

Hallå,
vore tacksam om någon kunde hjälpa mig lite med att slumpa nummer.
Jag har en tabell som ska innehålla en form av biljetter.
Varje biljett ska få ett unikt 6-siffrigt ID-nummer av typen INT.
Biljetter ska skapas med en stored procedure.

Hur slumpar jag bäst fram ett ledigt nummer mellan 100000 och 999999?
Man måste ju kolla så att det inte är upptaget i tabellen...
Jag använder SQL Server 2005.

Tack på förhand! :)

Medlem sedan dec. 20025 483 inlägg
#2

Ett identity-fält med startnummer 100000?

Medlem sedan juni 20008 205 inlägg
#3

Den som söker skall också finna.

Medlem sedan dec. 20025 483 inlägg
#4

Dock ett otroligt jobbigt sätt att få fram nästa, unika tal. För varje tal som slumpats måste det kollas så att det inte redan finns sparat. Ponera nu att 999998 av 999999 tal finns sparade - hur kul blir det att m.h.a. av en slumpgenerator hitta det sista talet?

Medlem sedan mars 20041 505 inlägg
#5

Peter S skrev:

Ett identity-fält med startnummer 100000?

Alla ID-nummer måste skapas slumpmässigt och inte sekventiellt.
Man ska alltså inte i förväg kunna gissa sig till vad nästa biljett får för nummer.
Jag inser att detta skapar onödigt mycket jobb men det är en beställning från ovan :P

spango skrev:

Den som söker skall också finna.

Ja visst, jag känner redan till diverse funktioner som slumpar fram nummer.
Men det måste ligga exakt mellan 100000-999999 och inte existera i en tabell.

Peter S skrev:

Dock ett otroligt jobbigt sätt att få fram nästa, unika tal. För varje tal som slumpats måste det kollas så att det inte redan finns sparat. Ponera nu att 999998 av 999999 tal finns sparade - hur kul blir det att m.h.a. av en slumpgenerator hitta det sista talet?

Intressant hypotes. Har man otur kan datorn rent teoretiskt hålla på i oändlighet innan den lyckas slumpa fram det lediga talet...

Medlem sedan mars 20041 505 inlägg
#6

Hm...så onödigt krångligt detta blev.
Ett alternativ är att använda en hash-summa med en fast bredd.
Finns det hash-algoritmer som ger summor som är runt 6-8 tecken?

Medlem sedan dec. 20025 483 inlägg
#7

Det vi skulle vilja göra är att slumpa fram talet är en given mängd. Denna mängd är differensen mellan A = {x | 100000 <= x <= 999999} och B = {x | x e SELECT id FROM tbl}, d.v.s. A \ B.

I SQL Server 2005 finns lyckligtvis EXCEPT som klarar detta. Så genom att först skapa en temporärtabell och sedan köra en EXCEPT mot de redan exiserande id:na, bör du kunna få ett slumpurval.

Medlem sedan juli 200012 978 inlägg
#8

Skulle man kunna tänka sig att gå andra vägen?
Skapa en tabell med alla godkända nummer. Lägg till ett fält med TS för uttag
Låt en randomfunktion skapa ett 1-4 långt nr som man söker på i den tabellen som har outtagna nr. Kvittera ut det så är det frid och fröjd.
Man kan tänka sig att med hjälp av antalet poster i den nya insatta tbellen välja längd på det man söker med.
Har jag förklarat mig otydligt?

Medlem sedan mars 20041 505 inlägg
#9

Lasp, du fick mig att tänka i nya banor :D
Man skapar alltså en tabell med färdiga "biljetter", dvs. alla godkända nummer.
Med hjälp av ett fält kan man avgöra om numret är ledigt eller ej.
Att slumpa fram ett ledigt nummer blir då inte svårare än såhär:

SELECT TOP 1 TicketId FROM Tickets WHERE (Status = 0) ORDER BY NEWID()

Detta är väl en bra lösning? :)

Medlem sedan dec. 20025 483 inlägg
#10

Japp :)

Medlem sedan mars 20041 505 inlägg
#11

Detta blev slutligen en mycket bra lösning,
tack för hjälpen alla! :)

130 ms totalt · 3 externa anrop · v20260731065814-full.b746b907
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)