PRIMA DELL'AGGIORNAMENTO soluzione di attivazione:
Puoi creare una stringa maiuscola alfanumerica casuale di 6 caratteri con:
lpad(conv(floor(rand()*pow(36,6)), 10, 36), 6, 0);
Per non creare una stringa già esistente puoi usare un BEFORE UPDATE
grilletto.
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 ;
Ogni volta che imposti il tuo CODE
colonna su NULL
in un UPDATE
istruzione, il trigger creerà una nuova stringa casuale in un ciclo finché non viene trovata alcuna corrispondenza nella tabella.
Ora puoi sostituire tutti i valori NULL con:
update unique_codes set CODE = NULL where code is NULL;
Nella demo SQLFiddle qui io uso una stringa casuale di un carattere per dimostrare che nessun valore è duplicato.
Puoi anche utilizzare lo stesso codice in un BEFORE INSERT
grilletto. In questo modo puoi semplicemente inserire nuove righe con CODE=NULL
e il trigger lo imposterà su una nuova stringa casuale univoca. E non dovrai più aggiornarlo.
Risposta originale (32 stringhe di caratteri):
select lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0) as rnd_str_8;
-- output example: 3AHX44TF
genererà una stringa casuale maiuscola alfanumerica di 8 caratteri. Concatena quattro di loro per ottenere 32 caratteri:
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
Allora che dire dell'unicità? Bene, prova a generare duplicati;-)