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