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;-)