lave en tabel pin med to felter val (integer) og inuse (boolean)
og bruge følgende til at assigne med:
SELECT val FROM pin WHERE NOT inuse ORDER BY RAND() LIMIT 1 gem værdi af val i X UPDATE pin SET inuse=TRUE WHERE val=X AND NOT inuse check antal opdaterede rækker, hvis 0 så træk en ny værdi fordi nogen snuppede denne for næsen af os
Det virker dog lidt voldsomt at skulle oprette alle pinkoder på forhånd. Med til historien hører også, at der tilknyttes en del ekstra information til pinkoden (udleveringsdato, reference til administrator, index på koden, index på datoen etc. etc. etc.) Tabellen kommer således til at fylde en del.
PT. er min fremgangsmåde: 1) Vælg en tilfædig pinkode 2) Hvis koden eksisterer i tabellen, gå til 1) igen 3) Hvis koden ikke eksisterer, opret den i tabellen og returner pinkode
Det er imidlertid hamrende ineffektivt når tabellen begynder at vokse.
Jeg kan gøre en del fra min applikation (cache), men hver pinkode fylder min 3 bytes -> i praksis 4 hvis ikke jeg skal definere nye (ineffektive) datatyper.
4bytes*999999=> 3,8MB RAM hvis jeg bruger et simpelt array.
Der *ER* hurtigt - så længe der er lille chance for positiv match i select.
Worst case kan jeg dog risikere at hænge uendeligt i select(random) så snart der er blot een optaget pinkode. I praksis begynder problemerne at dukke op når ca 1/3 af koderne er i brug.
En variant af den første måde: generer alle pinkoder, og gem dem i en tabel, men "bland" pinkoderne i tabellen i en app, så du blot altid skal tage den første, der ikke er i brug. Med passende index er det hurtigt!
Jeg mener løsninger med "ORDER BY RAND()" eller "top: træk random nummer select hvis fundet gå til top" er nødløsninger, eller kun for få data. De kan begge være tunge.
arne_v >> det er slet ikke utænkelig, men det skal vel vejes op imod, at hver gang inserten lykkes, er selecten overflødig(?) ... i dunno =)
- men under alle omstændigheder er Eriks fiksest
Synes godt om
Ny brugerNybegynder
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.