Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como faço para gerar uma string única e aleatória para uma das colunas da minha tabela MySql?


BEFORE UPDATE acionador solução:

Você pode criar uma string alfanumérica aleatória de 6 caracteres com:
lpad(conv(floor(rand()*pow(36,6)), 10, 36), 6, 0);

Para não criar uma string já existente, você pode usar um BEFORE UPDATE acionar.
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 ;

Toda vez que você definir seu CODE coluna para NULL em um UPDATE instrução, o gatilho criará uma nova string aleatória em um loop até que nenhuma correspondência seja encontrada na tabela.

Agora você pode substituir todos os valores NULL por:
update unique_codes set CODE = NULL where code is NULL;

Na demo SQLFiddle aqui eu uso uma string aleatória de um caractere para demonstrar que nenhum valor é duplicado.

Você também pode usar o mesmo código em um BEFORE INSERT acionar. Dessa forma, você pode inserir novas linhas com CODE=NULL e o gatilho irá defini-lo como uma nova string aleatória única. E você nunca precisará atualizá-lo novamente.

Resposta original (sequências de 32 caracteres):
select lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0) as rnd_str_8;

-- output example: 3AHX44TF

irá gerar uma string aleatória alfanumérica maiúscula de 8 caracteres. Concatene quatro deles para obter 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

Então e a unicidade? Bem - tente gerar duplicatas;-)