Previous answer बहुत सही नहीं है - आप चलाता के साथ सावधान रहना करने के लिए मिल गया है ... वे वास्तव में आप अगर में पास किसी भी डिफ़ॉल्ट मान के ऊपर लिख देगा उस उदाहरण के रूप में प्रयोग किया जाता है। प्राथमिक कुंजी सेट नहीं होने पर सबकुछ ठीक काम करेगा, लेकिन यदि आप INSERT के साथ एक को पास करते हैं तो यह ट्रिगर द्वारा एक नए यादृच्छिक एक के साथ मिटा दिया जाएगा।
यह ठीक से काम करने के लिए आप की जांच करना चाहिए क्षेत्र पहले से ही एक नया एक असाइन करने से पहले अपना महत्व होता है या नहीं, इस प्रकार है:
DELIMITER ;;
CREATE TRIGGER `sometrigger`
BEFORE INSERT ON `sometable`
FOR EACH ROW
BEGIN
IF ASCII(NEW.uuid) = 0 THEN
SET NEW.uuid = UNHEX(REPLACE(UUID(),'-',''));
END IF;
SET @last_uuid = NEW.uuid;
END
;;
मैं ASCII()
का उपयोग नए क्षेत्र मान की जाँच करने, ASCII()
के रूप में 0 वापस आ जाएगी रिक्त स्ट्रिंग के लिए डेटा टेक्स्ट या बाइनरी प्रारूप में है (और एक खाली स्ट्रिंग फ़ील्ड के लिए डिफ़ॉल्ट मान है जो डिफ़ॉल्ट सेट नहीं है)। मैं अपने यूयूआईडी को सबसे कुशल स्टोरेज स्पेस और क्वेरी स्पीड के लिए स्टोर करने के लिए बाइनरी (16) का उपयोग भी करता हूं ... यदि आप बाइनरी फ़ील्ड की जटिलताओं से निपटना नहीं चाहते हैं तो आप के स्थान पर UUID()
का उपयोग कर सकते हैं। चार (36) फ़ील्ड।
एक ट्रिगर? आदमी बदसूरत है :) धन्यवाद! – Blankman
+1 - आपने मेरे प्रश्न का उत्तर दिया है, जो कि मूल से बिल्कुल अलग था - लेकिन मैं इसकी सराहना करता हूं! – Fenton