Hallo Maribel,
Zufallszahlen in einer unique-Spalte zu verwenden ist schlichtweg zu Unperformant um es sinnvoll zu verwenden.
Worst Case: es ist von 8 Millionen moeglichen Eintraegen nur noch einer frei. Um den letzten freien Key zu finden muesste der Datenbankserver jetzt im unguenstigsten Fall 8000000 mal versuchen einen Random-Key zu testen (evtl auftretende doppelte Versuche mal nicht mitgezaehlt)
Mir sind 2 Moeglichkeiten eingefallen dies zu loesen:
1.) Du verwendest nicht 8 Stellen sondern benutzt eine fortlaufende ID und eine angehaengte Zufallszahl mit fester Laenge (die in der Datenbank zu der ID gespeichert ist und zusammen mit der ID validiert wird)
Beispiel: die ID ist 123, die Zufallszahl ist 9876, die ausgegebene Nummer lautet dann 1239876.
Bei der Validierung splittest du die Zahl (letzten 4 Stellen = Zufallszahl, alles davor ist die ID), selektierst die ID aus der Datenbank und vergleichst dann ob die zugehoerige Zufallszahl zu der ID gehoert.
Um das Problem mit den Jahreszahlen zu loesen koennte man auch noch die Jahreszahl mit benutzen.
2.) man hat eine Tabelle mit (anfangs) fortlaufenden Zahlen (also von 1 bis zur max. moeglichen Zahl). Bei jedem INSERT suchst du dir nun eine Zahl aus der Tabelle aus (SELECT zahl FROM verfuegbareids ORDER BY RAND() LIMIT 0,1) benutzt diese und loeschst diese anschliessend aus der Tabelle.
Hier muss man bei Multi-User-Umgebungen allerdings extra darauf achten das keine Dopplungen auftreten koennen. Ausserdem wirst du bei grossen Tabellen das oben genannte Select-Statement warscheinlich optimieren muessen bzw gegen ein anderes austauschen
Ich hoffe da war evtl ein Denkanstoss mit dabei
Gruesse
Stefan