Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment générer une chaîne unique et aléatoire pour l'une de mes colonnes de table MySql ?

Solution du déclencheur AVANT LA MISE À JOUR :

Vous pouvez créer une chaîne alphanumérique majuscule aléatoire de 6 caractères avec :

lpad(conv(floor(rand()*pow(36,6)), 10, 36), 6, 0);

Afin de ne pas créer une chaîne déjà existante, vous pouvez utiliser un BEFORE UPDATE gâchette.

DELIMITER //
CREATE TRIGGER `unique_codes_before_update`
BEFORE UPDATE ON `unique_codes` FOR EACH ROW 
BEGIN
    declare ready int default 0;
    declare rnd_str text;
    if new.CODE is null then
        while not ready do
            set rnd_str := lpad(conv(floor(rand()*pow(36,6)), 10, 36), 6, 0);
            if not exists (select * from unique_codes where CODE = rnd_str) then
                set new.CODE = rnd_str;
                set ready := 1;
            end if;
        end while;
    end if;
END//
DELIMITER ;

Chaque fois que vous définissez votre CODE colonne à NULL dans une UPDATE , le déclencheur créera une nouvelle chaîne aléatoire dans une boucle jusqu'à ce qu'aucune correspondance n'ait été trouvée dans la table.

Vous pouvez maintenant remplacer toutes les valeurs NULL par :

update unique_codes set CODE = NULL where code is NULL;

Dans la démo SQLFiddle ici j'utilise une chaîne aléatoire d'un caractère pour démontrer qu'aucune valeur n'est dupliquée.

Vous pouvez également utiliser le même code dans un BEFORE INSERT gâchette. De cette façon, vous pouvez simplement insérer de nouvelles lignes avec CODE=NULL et le déclencheur le définira sur une nouvelle chaîne aléatoire unique. Et vous n'aurez plus jamais besoin de le mettre à jour.

Réponse originale (chaînes de 32 caractères) :

select lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0) as rnd_str_8;

-- output example: 3AHX44TF

générera une chaîne aléatoire majuscule alphanumérique de 8 caractères. Concaténez quatre d'entre eux pour obtenir 32 caractères :

select concat(
    lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0),
    lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0),
    lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0),
    lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0)
) as rnd_str_32;

-- output example: KGC8A8EGKE7E4MGD4M09U9YWXVF6VDDS

http://sqlfiddle.com/#!9/9eecb7d/76933

Alors qu'en est-il de l'unicité ? Eh bien - essayez de générer des doublons;-)