sql >> Databasteknik >  >> RDS >> Mysql

Hur genererar jag en unik, slumpmässig sträng för en av mina MySql-tabellkolumner?

Före UPPDATERING triggerlösning:

Du kan skapa en slumpmässig alfanumerisk versalsträng med sex tecken med:

lpad(conv(floor(rand()*pow(36,6)), 10, 36), 6, 0);

För att inte skapa en redan befintlig sträng kan du använda en BEFORE UPDATE utlösare.

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 ;

Varje gång du ställer in din CODE kolumnen till NULL i en UPDATE uttalande, kommer utlösaren att skapa en ny slumpmässig sträng i en loop tills ingen matchning har hittats i tabellen.

Nu kan du ersätta alla NULL-värden med:

update unique_codes set CODE = NULL where code is NULL;

I SQLFiddle-demon här Jag använder en slumpmässig sträng med ett tecken för att visa att inget värde är duplicerat.

Du kan också använda samma kod i en BEFORE INSERT utlösare. På så sätt kan du bara infoga nya rader med CODE=NULL och utlösaren kommer att ställa in den på en ny unik slumpmässig sträng. Och du behöver aldrig uppdatera den igen.

Originalt svar (32 teckensträngar):

select lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0) as rnd_str_8;

-- output example: 3AHX44TF

kommer att generera en 8-teckens alfanumerisk slumpmässig sträng med versaler. Sammanfoga fyra av dem för att få 32 tecken:

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

Så hur är det med unikhet? Tja - försök att generera dubbletter;-)



  1. MySQL runda datum till början av veckan och månaden

  2. mysql ordning efter serialiserade data?

  3. kan jag använda en variabel för att specificera OUTFILE i mysql

  4. Bästa motsvarigheten för IsInteger i SQL Server