Mysql
 sql >> Database >  >> RDS >> Mysql

Come posso generare una stringa casuale univoca per una delle mie colonne della tabella MySql?

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