Je ne me préoccuperais pas du risque de collision. Générez simplement une chaîne aléatoire et vérifiez si elle existe. Si c'est le cas, réessayez et vous ne devriez pas avoir besoin de le faire plus de deux fois, sauf si vous avez déjà un grand nombre de plaques attribuées.
Une autre solution pour générer une chaîne pseudo-aléatoire longue de 8 caractères en (My)SQL pur :
SELECT LEFT(UUID(), 8);
Vous pouvez essayer ce qui suit (pseudo-code) :
DO
SELECT LEFT(UUID(), 8) INTO @plate;
INSERT INTO plates (@plate);
WHILE there_is_a_unique_constraint_violation
-- @plate is your newly assigned plate number
Étant donné que ce message a reçu un niveau d'attention inattendu, permettez-moi de souligner Commentaire de l'ADTC :le morceau de code ci-dessus est assez stupide et produit des chiffres séquentiels.
Pour un hasard un peu moins stupide, essayez quelque chose comme ça à la place :
SELECT LEFT(MD5(RAND()), 8)
Et pour un vrai hasard (cryptographiquement sécurisé), utilisez RANDOM_BYTES()
plutôt que RAND()
(mais j'envisagerais alors de déplacer cette logique vers la couche application).