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

Hvordan genererer jeg en unik, tilfældig streng til en af ​​mine MySql-tabelkolonner?

FØR OPDATERING udløser løsning:

Du kan oprette en tilfældig alfanumerisk streng med store bogstaver på 6 tegn med:

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

For ikke at oprette en allerede eksisterende streng kan du bruge en BEFORE UPDATE udløser.

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 ;

Hver gang du indstiller din CODE kolonne til NULL i en UPDATE sætning, vil udløseren oprette en ny tilfældig streng i en løkke, indtil der ikke er fundet noget match i tabellen.

Nu kan du erstatte alle NULL-værdier med:

update unique_codes set CODE = NULL where code is NULL;

I SQLFiddle-demoen her Jeg bruger en tilfældig streng med ét tegn for at demonstrere, at ingen værdi er duplikeret.

Du kan også bruge den samme kode i en BEFORE INSERT udløser. På denne måde kan du bare indsætte nye rækker med CODE=NULL og triggeren vil sætte den til en ny unik tilfældig streng. Og du behøver aldrig at opdatere det igen.

Oprindeligt svar (32 tegnstrenge):

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

-- output example: 3AHX44TF

vil generere en 8-tegns alfanumerisk tilfældig streng med store bogstaver. Sammensæt fire af dem for at få 32 tegn:

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å hvad med unikhed? Nå - prøv at generere dubletter;-)



  1. Flask efter eksempel – Opsætning af Postgres, SQLAlchemy og Alembic

  2. MySQL Insert Command vs T-SQL Query Syntaks med eksempler

  3. XML-tabel med Oracle 11g

  4. Når du bruger SELECT, kan du ændre værdien af ​​et returneret felt baseret på andre felter?