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