sql >> Database >  >> RDS >> Mysql

Hoe genereer ik een unieke, willekeurige tekenreeks voor een van mijn MySql-tabelkolommen?

VOOR UPDATE trigger-oplossing:

U kunt een willekeurige alfanumerieke tekenreeks van 6 tekens maken met:

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

Om geen reeds bestaande string te maken, kunt u een BEFORE UPDATE . gebruiken trekker.

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 ;

Elke keer dat u uw CODE . instelt kolom naar NULL in een UPDATE statement, zal de trigger een nieuwe willekeurige string in een lus maken totdat er geen overeenkomst is gevonden in de tabel.

Nu kunt u alle NULL-waarden vervangen door:

update unique_codes set CODE = NULL where code is NULL;

In de SQLFiddle-demo hier ik gebruik een willekeurige tekenreeks van één teken om aan te tonen dat er geen waarde wordt gedupliceerd.

U kunt dezelfde code ook gebruiken in een BEFORE INSERT trekker. Op deze manier kun je gewoon nieuwe rijen invoegen met CODE=NULL en de trigger zal het instellen op een nieuwe unieke willekeurige reeks. En je hoeft het nooit meer bij te werken.

Oorspronkelijk antwoord (reeksen van 32 tekens):

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

-- output example: 3AHX44TF

genereert een alfanumerieke willekeurige reeks van 8 tekens in hoofdletters. Voeg er vier aan elkaar toe om 32 tekens te krijgen:

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

Dus hoe zit het met uniciteit? Nou - probeer duplicaten te genereren;-)



  1. Eén quizitem per pagina (php/mysql-quizprogramma)

  2. MySQL algemeen querylogboek inschakelen met JDBC

  3. execSQL:is bindargs beter?

  4. MySQL - alternatieven voor geneste subquery's bij het beperken van geaggregeerde gegevens in een gecorreleerde subquery