अद्यतन ट्रिगर समाधान से पहले:
आप इसके साथ एक 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
तो विशिष्टता के बारे में क्या? अच्छा - डुप्लीकेट जेनरेट करने का प्रयास करें;-)