Comment générer une chaîne aléatoire unique pour l'une de mes colonnes de table MySql?
Je suis en utilisant MySql 5.5.37. J'ai une table avec les colonnes suivantes
+------------------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------+------------------+------+-----+---------+-------+
| ID | varchar(32) | NO | PRI | NULL | |
| CODE | varchar(6) | NO | UNI | NULL | |
La colonne code est unique et ma colonne ID est un GUID. J'ai un certain nombre de lignes que je voudrais mettre à jour, sous réserve de certains critères dans le tableau ci-dessus (par exemple LORSQUE COLONNE1 = 0). Comment puis-je générer de l'aléatoire, unique 6-codes de caractères (idéalement des lettres et des chiffres) pour mon CODE de la colonne de manière à ne pas violer la contrainte unique dans ma table? Notez que les colonnes de la table qui ne répondent pas aux critères (par exemple, Où COLONNE1 <> 0)) ont déjà des valeurs uniques pour la colonne CODE.
Edit: Ce qui est différent de cette question -- La génération aléatoire & unique 8 chaîne de caractères à l'aide de MySQL parce que ce lien traite avec des Id qui sont numériques. Mon Id sont de 32 chaînes de caractères. Aussi leur solution ne permet pas de prendre en compte le fait qu'il puisse valeurs dans la table avant d'exécuter les instructions que je veux courir qui va générer un unique les valeurs de la colonne en question.
source d'informationauteur Dave
Vous devez vous connecter pour publier un commentaire.
AVANT de déclencheur de mise à JOUR de la solution:
Vous pouvez créer un 6 caractères alphanumériques aléatoires majuscules chaîne avec:
Afin de ne pas créer une chaîne, vous pouvez utiliser un
BEFORE UPDATE
déclencheur.Chaque fois que vous réglez votre
CODE
colonne deNULL
dans unUPDATE
déclaration, le déclenchement de créer une nouvelle chaîne aléatoire dans une boucle jusqu'à ce qu'aucune correspondance n'a été trouvée dans le tableau.Maintenant, vous pouvez remplacer toutes les valeurs NULL avec:
Dans le SQLFiddle démo ici - je utiliser un caractère aléatoire de la chaîne de démontrer qu'aucune valeur n'est dupliqué.
Vous pouvez également utiliser le même code dans un
BEFORE INSERT
déclencheur. De cette façon, vous pouvez simplement insérer de nouvelles lignes avecCODE=NULL
et le déclenchement de définir une unique chaîne de caractères aléatoires. Et vous n'aurez plus jamais besoin de le mettre à jour à nouveau.Réponse originale à cette question (32 chaînes de caractères):
va générer un 8 caractères alphanumériques majuscules chaîne aléatoire. Concaténer quatre d'entre eux pour obtenir de 32 caractères:
http://sqlfiddle.com/#!9/9eecb7d/76933
Alors que sur le uniqness? Bien essayez de générer des doublons 😉
vous obtiendrez le prochain numéro de " encodée en base 36 (chiffres & lettres majuscules).
Par exemple:
C'est délicat, mais je pense que j'ai atteint une belle solution:
Tout d'abord, j'ai créé une fonction qui renvoie une chaîne aléatoire de 6 caractères qu'il est utilisé à la suite d'génère souhaité codes:
Puis j'ai créé une procédure qui est responsable de la mise à jour de la table aléatoire de codes uniques.
La procédure consiste à:
Compter tous les enregistrements qui sera mis à jour avec une nouvelle et aléatoire code de 6 caractères.
SELECT COUNT(1) INTO @count FROM demo.codes;
Puis, foreach ligne (à l'aide de
WHILE
boucle):Obtenir l'id de l'enregistrement suivant pour être uptdated
PREPARE stmt FROM "SELECT @id := id, @itemCode := code FROM demo.codes p LIMIT ?, 1;";
EXECUTE stmt USING @i;
Obtenir un nouveau code pour l'enregistrement:
SET @code = getRandomAlphaNumeric();
Pour le dernier, vérifier si le nouveau code n'existe pas déjà sur la table et si actuellement le champ de la colonne n'a pas de valeur (est
NULL
)si elle n'est pas mise à jour de l'enregistrement en cours avec le code aléatoire:SELECT COUNT(1) INTO @countRowsWithCode FROM demo.codes WHERE code = @code;
IF @countRowsWithCode = 0 AND @itemCode IS NULL THEN
UPDATE demo.codes SET code = @code WHERE id = @id;
END IF;
Enfin,
CALL
le crééPROCEDURE
afin de remplir les champs decode
colonne qui sontNULL
.CALL generateCodes();
Essayez ceci pour code
LEFT(MD5(NOW()), 6)
ce sera le retour de code unique avec 6 caractères.Essayer une autre façon, comme ce
LEFT(UUID(), 6)
Ce sera aussi le retour code uniqueAppel de cette procédure stockée comme
Cela vous donnera un unique 8 chaîne de caractères à chaque fois.