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