2008-12-11 12 views
10

के रूप में फ़ील्ड के लिए डिफ़ॉल्ट मान सेट करें मेरे पास एक सारणी है जो इस अभिनेता (forename, उपनाम, stage_name) की तरह दिखती है;MySQL - स्ट्रिंग कॉन्सटेनेशन फ़ंक्शन

मैं ताकि

insert into actors(forename, surname) values ('Stack', 'Overflow'); 

रिकॉर्ड

'Stack'  'Overflow' 'Stack Overflow' 

यह संभव है का उत्पादन होता stage_name अद्यतन करने के लिए

forename." ".surname 

का डिफ़ॉल्ट मान करना चाहते हैं?

धन्यवाद :)

उत्तर

14

MySQL कॉलम परिभाषा के DEFAULT विकल्प में गणना किए गए कॉलम या अभिव्यक्तियों का समर्थन नहीं करता है।

आप ट्रिगर में ऐसा कर सकते हैं (MySQL 5.0 या अधिक) की आवश्यकता:

CREATE TRIGGER format_stage_name 
BEFORE INSERT ON actors 
FOR EACH ROW 
BEGIN 
    SET NEW.stage_name = CONCAT(NEW.forename, ' ', NEW.surname); 
END 

तुम भी एक ऐसी ही ट्रिगर BEFORE UPDATE बनाना चाह सकते हैं।

, पूर्व नाम और उपनाम में NULL से सावधान रहें, क्योंकि किसी अन्य तार के साथ एक NULL की concat एक NULL पैदा करता है। प्रत्येक कॉलम पर या समेकित स्ट्रिंग पर उपयुक्त के रूप में COALESCE() का उपयोग करें।

संपादित करें: निम्न उदाहरण सेट stage_name केवल अगर यह NULL है। अन्यथा आप अपने INSERT कथन में stage_name निर्दिष्ट कर सकते हैं, और इसे संरक्षित किया जाएगा।

CREATE TRIGGER format_stage_name 
BEFORE INSERT ON actors 
FOR EACH ROW 
BEGIN 
    IF (NEW.stage_name IS NULL) THEN 
    SET NEW.stage_name = CONCAT(NEW.forename, ' ', NEW.surname); 
    END IF; 
END 
+0

मैं उपयोग नहीं किया है MySQL, लेकिन यह हमेशा श्रेणीबद्ध मूल्य के साथ स्तंभ के ऊपर लिख देगा? यदि आप इसे डिफ़ॉल्ट के रूप में कार्य करना चाहते हैं तो आपको इसे ओवरराइड करने में सक्षम होना चाहिए, इसलिए मुझे लगता है कि आपको NEW.stage_name पर एक सहवास की आवश्यकता होगी। –

+0

@ बिल-करविन मुझे 'NEW.aka = CONCAT (NEW.fname, '', NEW.lname) 'पर एक वाक्यविन्यास त्रुटि मिल रही है ... मेरा पूरा आदेश देखें [** यहां पेस्टबिन ** पर] (http : //pastebin.com/FiEUBgcu) ... कोई पॉइंटर्स ?? – mOrloff

+0

@mOrloff, मैं 'SET' कीवर्ड भूल गया। मैंने इसे ठीक करने के लिए ऊपर दिए गए कोड को संपादित किया है। –

2

10.1.4. Data Type Default Values के अनुसार नहीं, तुम ऐसा नहीं कर सकते। आप केवल स्थिर या CURRENT_TIMESTAMP का उपयोग कर सकते हैं।

ओटीओएच यदि आप बहुत अद्यतित हैं, तो आप शायद एक ही चीज़ को पूरा करने के लिए trigger का उपयोग कर सकते हैं।

2

मेरा पहला विचार यह है कि यदि आपके पास अन्य फ़ील्ड में दो मान हैं तो उन्हें तीसरे क्षेत्र में अनावश्यक रूप से संग्रहीत करने की अनिवार्य आवश्यकता क्या है? यह सामान्यीकरण और दक्षता के चेहरे में उड़ता है।

यदि आप बस समेकित मूल्य को स्टोर करना चाहते हैं तो आप केवल एक दृश्य (या आईएमएसएनएचओ भी एक संग्रहीत प्रक्रिया बेहतर कर सकते हैं) जो मूल्यों को एक छद्म actor फ़ील्ड में जोड़ता है और इसके पढ़ने/स्पोक के बजाय आपके पढ़ने को निष्पादित करता है सीधे तालिका।

आप पूरी तरह श्रेणीबद्ध मूल्य आप दो तरह से इस संभाल सकता स्टोर करना आवश्यक है:

1) सीधे एसक्यूएल के बजाय अपने आवेषण करने के लिए एक संग्रहीत प्रक्रिया का उपयोग करें। इस तरह आप उन मानों के लिए मूल्य प्राप्त कर सकते हैं और उस क्षेत्र के लिए एक मान बना सकते हैं, जिसे आप पॉप्युलेट करना चाहते हैं, फिर कलाकारों के क्षेत्र के लिए एक समेकित मूल्य सहित सम्मिलित कथन बनाएं।

2) इसलिए मैं बहुत अधिक आग नहीं खींचता, बच्चे के दस्ताने के साथ इस सुझाव का इलाज करता हूं। केवल अंतिम उपाय के रूप में उपयोग करें। यदि आप शून्य छोड़ दिया जाता है तो मूल्य बनाने के लिए ट्रिगर जोड़कर आप इस व्यवहार को हैक कर सकते हैं। आम तौर पर ट्रिगर्स अच्छे नहीं होते हैं।वे काफी सरल बातचीत के लिए अदृश्य लागत और बातचीत जोड़ते हैं। हालांकि, रिकॉर्ड डालने या अपडेट होने के बाद आप कलाकार फ़ील्ड को अपडेट करने के लिए CREATE TRIGGER का उपयोग कर सकते हैं। यहाँ संदर्भ पृष्ठ है:

http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

+0

हालांकि यह समेकित मूल्य पर डिफ़ॉल्ट है, इसका मतलब यह नहीं है कि डिफ़ॉल्ट को सम्मिलित या बाद में अपडेट किया जा सकता है –

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

  • कोई संबंधित समस्या नहीं^_^