ANTES DE LA ACTUALIZACIÓN desencadenar solución:
Puede crear una cadena mayúscula alfanumérica aleatoria de 6 caracteres con:
lpad(conv(floor(rand()*pow(36,6)), 10, 36), 6, 0);
Para no crear una cadena ya existente, puede usar BEFORE UPDATE
generar.
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 ;
Cada vez que configuras tu CODE
columna a NULL
en un UPDATE
instrucción, el activador creará una nueva cadena aleatoria en un bucle hasta que no se encuentre ninguna coincidencia en la tabla.
Ahora puede reemplazar todos los valores NULL con:
update unique_codes set CODE = NULL where code is NULL;
En la demostración de SQLFiddle aquí utilizo una cadena aleatoria de un carácter para demostrar que no se duplica ningún valor.
También puede usar el mismo código en un BEFORE INSERT
generar. De esta manera, solo puede insertar nuevas filas con CODE=NULL
y el activador lo establecerá en una nueva cadena aleatoria única. Y nunca más necesitarás actualizarlo.
Respuesta original (cadenas de 32 caracteres):
select lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0) as rnd_str_8;
-- output example: 3AHX44TF
generará una cadena aleatoria alfanumérica en mayúsculas de 8 caracteres. Concatene cuatro de ellos para obtener 32 caracteres:
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
Entonces, ¿qué pasa con la unicidad? Bueno, intenta generar duplicados;-)