SEBELUM MEMPERBARUI solusi pemicu:
Anda dapat membuat string huruf besar alfanumerik acak 6 karakter dengan:
lpad(conv(floor(rand()*pow(36,6)), 10, 36), 6, 0);
Agar tidak membuat string yang sudah ada, Anda dapat menggunakan BEFORE UPDATE
pemicu.
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 ;
Setiap kali Anda menyetel CODE
kolom ke NULL
dalam UPDATE
pernyataan, pemicu akan membuat string acak baru dalam satu lingkaran sampai tidak ada kecocokan yang ditemukan di tabel.
Sekarang Anda dapat mengganti semua nilai NULL dengan:
update unique_codes set CODE = NULL where code is NULL;
Dalam demo SQLFiddle di sini saya menggunakan string acak satu karakter untuk menunjukkan bahwa tidak ada nilai yang diduplikasi.
Anda juga dapat menggunakan kode yang sama di BEFORE INSERT
pemicu. Dengan cara ini Anda bisa memasukkan baris baru dengan CODE=NULL
dan pemicu akan menyetelnya ke string acak unik yang baru. Dan Anda tidak perlu memperbaruinya lagi.
Jawaban asli (32 karakter string):
select lpad(conv(floor(rand()*pow(36,8)), 10, 36), 8, 0) as rnd_str_8;
-- output example: 3AHX44TF
akan menghasilkan string acak huruf besar alfanumerik 8 karakter. Gabungkan empat dari mereka untuk mendapatkan 32 karakter:
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
Lalu bagaimana dengan keunikan? Yah - coba buat duplikat;-)