Решение за задействане ПРЕДИ АКТУАЛИЗИРАНЕ:
Можете да създадете произволен низ от 6 символа с главни букви и цифри с:
lpad(conv(floor(rand()*pow(36,6)), 10, 36), 6, 0);
За да не създавате вече съществуващ низ, можете да използвате BEFORE UPDATE
задействане.
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 ;
Всеки път, когато задавате своя CODE
колона до NULL
в UPDATE
операторът, тригерът ще създаде нов произволен низ в цикъл, докато не бъде намерено съвпадение в таблицата.
Сега можете да замените всички NULL стойности с:
update unique_codes set CODE = NULL where code is NULL;
В демото на SQLFiddle тук използвам произволен низ от един знак, за да демонстрирам, че нито една стойност не се дублира.
Можете също да използвате същия код в BEFORE INSERT
задействане. По този начин можете просто да вмъкнете нови редове с CODE=NULL
и тригерът ще го настрои на нов уникален произволен низ. И никога повече няма да е необходимо да го актуализирате.
Оригинален отговор (32 символни низа):
select lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0) as rnd_str_8;
-- output example: 3AHX44TF
ще генерира произволен низ от 8 знака с главни букви и букви. Свържете четири от тях, за да получите 32 знака:
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
И така, какво ще кажете за уникалността? Добре - опитайте се да генерирате дубликати;-)