2008-11-19 16 views
6

लिए एक डिफ़ॉल्ट मान के रूप में चालू वर्ष जोड़ने मैं MySQL में निम्न तालिका (संस्करण 5):MySQL: एक क्षेत्र 'वर्ष'

id int(10)  UNSIGNED    No auto_increment     
year varchar(4) latin1_swedish_ci No    
title varchar(250) latin1_swedish_ci Yes NULL   
body text   latin1_swedish_ci Yes NULL 

और मैं ऑटो के लिए डाटाबेस डालने पर चालू वर्ष जोड़ना चाहते हैं , मैं निम्नलिखित एसक्यूएल बयान की कोशिश की है:

ALTER TABLE `tips` CHANGE `year` `year` VARCHAR(4) NOT NULL DEFAULT year(now()) 

लेकिन यह निम्न त्रुटि देता है:

1067 - Invalid default value for 'year' 

क्या मैं इस मज़ा पाने के लिए क्या कर सकते हैं ctionality? अग्रिम में धन्यवाद!

@ gabriel1863: उत्तर के लिए धन्यवाद, लेकिन मुझे अभी भी एक ही त्रुटि मिल रही है। यहां तक ​​कि जब मैं साल के क्षेत्र में बैकटिक्स का उपयोग करता हूं।

मदद के लिए सभी को धन्यवाद!

+0

ही नाम के साथ होने स्तंभों के रूप में एक डेटाप्रकार आम तौर पर एक बहुत बुरी विचार – warren

उत्तर

14

The DEFAULT value clause in a data type specification indicates a default value for a column. With one exception, the default value must be a constant; it cannot be a function or an expression. This means, for example, that you cannot set the default for a date column to be the value of a function such as NOW() or CURRENT_DATE. The exception is that you can specify CURRENT_TIMESTAMP as the default for a TIMESTAMP column.

-- MySQL Manual

हालांकि, आप एक trigger कि मूल्य सेट लिख सकते हैं। काश मैं मदद कर सकता हूं, लेकिन मैं MySQL में संग्रहित प्रक्रियाओं को लिखने से वास्तव में परिचित नहीं हूं।

मुझे लगता है कि यह काम करेगा:

CREATE TRIGGER ins_year 
BEFORE INSERT ON tips 
    FOR EACH ROW SET NEW.year = YEAR(NOW()); 
7

निम्नलिखित काम करना चाहिए:

ALTER TABLE tips MODIFY COLUMN year YEAR(4) NOT NULL DEFAULT CURRENT_TIMESTAMP 

अधिक जानकारी के लिए Year Data Type देखते हैं।

तो, मैंने इसे एक्सेस करने के बाद इसका परीक्षण किया और यह काम नहीं करता है। जैसा कि एक अन्य पोस्टर ने इंगित किया है CURRENT_TIMESTAMP केवल TIMESTAMP डेटा प्रकार पर काम करता है।

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

CREATE TRIGGER example_trigger AFTER INSERT ON tips 
FOR EACH ROW BEGIN 
UPDATE tips SET year = YEAR(NOW()) WHERE tip_id = NEW.tip_id 
END; 

, अपने कोड के भीतर से सम्मिलित बयान को यह मान असाइन:

आपका दूसरा विकल्प एक trigger बनाने के लिए किया जाएगा।

आपके मामले में सबसे अच्छा समाधान पूरी तरह से आपके विशेष आवेदन के आसपास की परिस्थितियों पर निर्भर करेगा।

+0

सुंदर है, मैं आज बिल्कुल वही बात के लिए देख रहा था! – Tom

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