PRZED AKTUALIZACJĄ rozwiązanie wyzwalacza:
Możesz utworzyć 6-znakowy losowy ciąg alfanumeryczny składający się z wielkich liter za pomocą:
lpad(conv(floor(rand()*pow(36,6)), 10, 36), 6, 0);
Aby nie tworzyć już istniejącego ciągu, możesz użyć BEFORE UPDATE
cyngiel.
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 ;
Za każdym razem, gdy ustawiasz swój CODE
kolumna na NULL
w UPDATE
instrukcji, wyzwalacz utworzy nowy losowy ciąg w pętli, dopóki w tabeli nie zostanie znalezione żadne dopasowanie.
Teraz możesz zamienić wszystkie wartości NULL na:
update unique_codes set CODE = NULL where code is NULL;
W demo SQLFiddle używam jednoznakowego losowego ciągu, aby zademonstrować, że żadna wartość nie jest zduplikowana.
Możesz również użyć tego samego kodu w BEFORE INSERT
cyngiel. W ten sposób możesz po prostu wstawić nowe wiersze z CODE=NULL
a wyzwalacz ustawi go na nowy unikalny losowy ciąg. I już nigdy nie będziesz musiał go aktualizować.
Oryginalna odpowiedź (32 ciągi znaków):
select lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0) as rnd_str_8;
-- output example: 3AHX44TF
wygeneruje losowy ciąg składający się z 8 znaków alfanumerycznych pisanych wielkimi literami. Połącz cztery z nich, aby uzyskać 32 znaki:
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
A co z wyjątkowością? Cóż - spróbuj wygenerować duplikaty;-)