PŘED AKTUALIZACÍ řešení spouštěče:
Pomocí:
můžete vytvořit 6-znakový náhodný alfanumerický řetězec velkých písmenlpad(conv(floor(rand()*pow(36,6)), 10, 36), 6, 0);
Abyste nevytvářeli již existující řetězec, můžete použít BEFORE UPDATE
spoušť.
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 ;
Pokaždé, když nastavíte svůj CODE
sloupec na NULL
v UPDATE
spouštěč vytvoří nový náhodný řetězec ve smyčce, dokud nebude v tabulce nalezena žádná shoda.
Nyní můžete všechny hodnoty NULL nahradit:
update unique_codes set CODE = NULL where code is NULL;
V ukázce SQLFiddle zde Používám jednoznakový náhodný řetězec k prokázání, že žádná hodnota není duplikována.
Stejný kód můžete použít také v BEFORE INSERT
spoušť. Tímto způsobem stačí vložit nové řádky s CODE=NULL
a spouštěč jej nastaví na nový jedinečný náhodný řetězec. A už ho nikdy nebudete muset aktualizovat.
Původní odpověď (32 znakových řetězců):
select lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0) as rnd_str_8;
-- output example: 3AHX44TF
vygeneruje 8místný alfanumerický náhodný řetězec velkých písmen. Spojením čtyř z nich získáte 32 znaků:
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
Jak je to tedy s jedinečností? No - zkuste vygenerovat duplikáty;-)