mysql

2010-10-30 14 views
10

में कॉलम के लिए GUID का डिफ़ॉल्ट मान मैं एक कॉलम को GUID पर डिफ़ॉल्ट करना चाहता हूं, इसलिए यदि मैं एक सम्मिलित कर रहा हूं और मैं स्पष्ट रूप से मान सेट नहीं करता हूं, तो मैं इसे एक नए GUID मान में डिफ़ॉल्ट करना चाहता हूं ।mysql

मैं यह कैसे कर सकता हूं?

उत्तर

9

चूंकि यूयूआईडी() को एक डिफॉल्ट बाधा के रूप में स्वीकार नहीं किया जाता है, तो आपको एक ट्रिगर का उपयोग करने की आवश्यकता होती है।

यह एक NEW_TABLE.uuid स्तंभ के लिए मूल्य सेट:

delimiter $$ 

CREATE 
DEFINER=`root`@`localhost` 
TRIGGER `example`.`newid` 
BEFORE INSERT ON `example`.`new_table` 
FOR EACH ROW 
BEGIN 
    SET NEW.`uuid` = UUID(); 
END 
$$ 
+1

एक ट्रिगर? आदमी बदसूरत है :) धन्यवाद! – Blankman

+0

+1 - आपने मेरे प्रश्न का उत्तर दिया है, जो कि मूल से बिल्कुल अलग था - लेकिन मैं इसकी सराहना करता हूं! – Fenton

8

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) फ़ील्ड।