2008-11-06 14 views
56

मैं इस तरह कुछ करना चाहता हूँ:क्या मैं MySQL में डिफ़ॉल्ट मान के लिए फ़ंक्शन का उपयोग कर सकता हूं?

 

create table app_users 
(
    app_user_id smallint(6) not null auto_increment primary key, 
    api_key  char(36) not null default uuid() 
); 
 

हालांकि यह एक त्रुटि में परिणाम है, वहाँ एक रास्ता mysql में एक डिफ़ॉल्ट मान के लिए एक समारोह कॉल करने के लिए है?

धन्यवाद।

उत्तर

97

नहीं, आप नहीं कर सकते हैं।

हालांकि, आप आसानी से यह करने के लिए एक ट्रिगर, जैसे बना सकते हैं:

 
CREATE TRIGGER before_insert_app_users 
    BEFORE INSERT ON app_users 
    FOR EACH ROW 
    SET new.api_key = uuid(); 
+1

@ देखें http://stackoverflow.com/questions/6280789/generate-guid-in-mysql-for-existing- डेटा। –

+1

यह एक निश्चित मूल्य होने के समान नहीं है। यदि मूल्य शून्य था तो केवल इस कुंजी को केवल कुंजी सेट करने के लिए कैसे बदल सकता है? – ToolmakerSteve

+0

मैंने इसे md5 (uuid()) के साथ संशोधित किया और ठीक काम किया। क्या मेरा अपमान ठीक था? –

8

दुर्भाग्यवश नहीं, MySQL 5 को डिफ़ॉल्ट के लिए स्थिरांक की आवश्यकता है। इस मुद्दे पर नीचे दिए गए लिंक में अधिक विस्तार से चर्चा की गई थी। लेकिन एकमात्र जवाब नल को अनुमति देना और टेबल ट्रिगर जोड़ना है।

MySQL ने हाल ही में अपने डीबी पैकेज के हिस्से के रूप में यूयूआईडी को स्वीकार कर लिया है, और यह उतना ही समृद्ध नहीं है जितना हम चाहते हैं।

http://www.phpbuilder.com/board/showthread.php?t=10349169

+0

मैं जोड़ने चाहिए कि अनुमति देता है नल और ट्रिगर्स पर भरोसा कर सकते हैं, लेकिन अधिकांश डेवलपर्स इसे एक बहुत ही हैक-वाई समाधान मानेंगे। मैं व्यक्तिगत रूप से इसकी सिफारिश नहीं करता बल्कि प्रत्येक के लिए। मौजूदा पंक्तियों में यूयूआईडी को पॉप्युलेट करने के लिए – TravisO

5

मेरा मानना ​​है कि you can't:

डिफ़ॉल्ट मान एक निरंतर होना चाहिए; यह एक फ़ंक्शन या अभिव्यक्ति नहीं हो सकता है

+0

सच नहीं है, आप getdate() –

+5

@amrosama - नहीं, का उपयोग कर सकते हैं। 'getdate()' एक MySQL फ़ंक्शन भी नहीं है। उत्तर में लिंक एकमात्र अपवाद बताता है: * «आप TIMESTAMP कॉलम» * के लिए डिफ़ॉल्ट के रूप में CURRENT_TIMESTAMP निर्दिष्ट कर सकते हैं। –

+0

CURRENT_TIMESTAMP एकमात्र "फ़ंक्शन" है जिसे डिफ़ॉल्ट मान के रूप में उपयोग किया जा सकता है। बाकी सब कुछ स्थिर होना चाहिए (दुर्भाग्य से)। –

16

जैसा कि पहले से ही कहा गया है कि आप नहीं कर सकते हैं।

आप इस व्यवहार अनुकरण करने के लिए आप इस तरह से एक ट्रिगर का उपयोग कर सकते हैं:

CREATE TRIGGER before_insert_app_users 
BEFORE INSERT ON app_users 
FOR EACH ROW 
    IF new.uuid IS NULL 
    THEN 
    SET new.uuid = uuid(); 
    END IF; 

तुम अब भी पहले से मौजूद पंक्तियों को अद्यतन करने, इस तरह है:

UPDATE app_users SET uuid = (SELECT uuid()); 
+0

मुझे इस कोड के साथ एक वाक्यविन्यास त्रुटि मिलती है। ऐसा लगता है कि यूआईआईडी() को कॉल के लिए कॉल की अनुमति नहीं है। कोई सुझाव? –

+1

mysql का कौन सा संस्करण आप उपयोग कर रहे हैं? मैंने 5.5 के लिए इस वाक्यविन्यास का प्रयास किया है और यह काम करता है। वैकल्पिक रूप से 'uuid()' को '(यूआईआईडी() चुनें' के साथ बदलने का प्रयास करें – Pamput

संबंधित मुद्दे

 संबंधित मुद्दे