sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo genero una cadena única y aleatoria para una de las columnas de mi tabla MySql?

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