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