2012-10-14 21 views
12

मैं संबंधित प्रश्नों का एक बहुत देखा है के लिए अद्यतन CURRENT_TIMESTAMP पर अनुमति नहीं दे रहा है, लेकिन मैं इस विशिष्ट प्रश्न पर मेरी उंगली नहीं डाल सकते कर सकते हैं: (जब के लिएMySQL एक DATETIME क्षेत्र

मैं दोनों एक टाइमस्टैम्प के साथ एक MySQL तालिका है फ़ील्ड बनाया गया था) और एक डेटाटाइम (प्रत्येक बार फ़ील्ड अपडेट हो जाता है)। यह इस तरह दिखता है:

CREATE TABLE 'vis' (
ID BIGINT PRIMARY KEY AUTO_INCREMENT NOT NULL, 
ENTRY VARCHAR(255), 
AUTHOR VARCHAR(255), 
CREATED_AT TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
UPDATED_AT DATETIME ON UPDATE CURRENT_TIMESTAMP, 
UPDATED_BY VARCHAR(255) 
) 

जब मैं इस हालांकि कोशिश, त्रुटि मैं हो रही है: (SQL Error: 1294 SQL State: HY000) - Invalid ON UPDATE clause for 'updated_at' field

हर जगह मैंने पढ़ा है (यहां तक ​​कि स्टैक ओवरफ़्लो पर) से पता चलता मैंने अभी तक ऐसा करने में सक्षम होना चाहिए, मुझे यह त्रुटि मिल रही है। शायद एक ऐसा क्षेत्र है जहां हर बार जब मैं इसे अपडेट करता हूं तो स्वचालित रूप से उस समय को अद्यतन करता है?

मैं MySQL सर्वर 5.5 का उपयोग कर रहा हूं।

उत्तर

20

DATETIME अद्यतन पर CURRENT_TIMESTAMP का उपयोग नहीं कर सकता। इसके बजाय, इसे TIMESTAMP पर बदलें।

या, इस स्थिति के लिए एक ट्रिगर का उपयोग करें: http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html

संपादित करें: टिप्पणी में के रूप में (धन्यवाद @ АлександрФишер!), यह नहीं रह गया है MySQL 5.6.5 के बाद से मामला है, तो एक और समाधान के उन्नयन के लिए है यदि संभव हो तो आपका सर्वर।

+2

यह पूरी तरह से काम करता है, धन्यवाद! मैंने टेबल घोषणा पर 'अद्यतन अद्यतन समय पर' से छुटकारा पा लिया, और फिर मैंने तालिका बनाने के बाद इस वाक्यविन्यास को संसाधित किया: प्रत्येक पंक्ति सेट के लिए 'विज़िटर ऑन' v'update_entry 'पहले से सेट करें' NEW.updated_at = CURRENT_TIMESTAMP'और अब यह हर बार अपडेट होता है जब मैं उस विशेष पंक्ति को अद्यतन करता हूं। कहानी का नैतिक: ** कहीं भी ऑनलाइन जो कहता है कि आप दो टाइमस्टैम्प या ऑनडेट के साथ डेटाटाइम कर सकते हैं गलत है! ** कम से कम MySQL सर्वर 5.5 के लिए। –

+3

@MichaelPlautz - "धन्यवाद, मैंने इसे आपके संसाधन के साथ हल किया" के बजाय हमेशा अच्छा लगा "ठीक है, लेकिन मुझे इसे ट्रिगर पर करने के लिए कोड चाहिए", धन्यवाद :) – slugonamission

+2

प्रयुक्त संस्करण बहुत महत्वपूर्ण प्रतीत होता है। दस्तावेज़ीकरण का कहना है कि यह काम करेगा यदि MySQL संस्करण 5.6 का उपयोग किया जाता है: http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html। मैं पुष्टि नहीं कर सकता क्योंकि मेरा सर्वर 5.1 :( –

0

हाँ, और यदि आप न DEFAULT CURRENT_TIMESTAMP है और न ही ON UPDATE CURRENT_TIMESTAMP साथ टाइमस्टैम्प के लिए, यह बदलने के लिए, यह DEFAULT CURRENT_TIMESTAMP और ON UPDATE CURRENT_TIMESTAMP दोनों को निर्दिष्ट के समान है।

+0

कृपया स्पष्ट करें: बिना किसी संशोधक के, यह स्वचालित रूप से डिफ़ॉल्ट और अद्यतन? –

1

MySQL नहीं कार्यों डिफ़ॉल्ट DateTime मूल्यों के लिए इस्तेमाल किया जा करने की अनुमति है। (MySQL डेटा प्रकार Defaults देखें।)

5

यह सुविधा 5.6 में पेश की गई प्रतीत होती है। मेरे डिफ़ॉल्ट ओएस एक्स इंस्टॉल पर अपेक्षित के रूप में काम करता है।

संदर्भ: Automatic Timestamp Properties Before MySQL 5.6.5

+2

http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html – Jeff

0

टाइमस्टैम्प और (MySQL 5.6.5) के रूप में DATETIME डेटा प्रकार वर्तमान दिनांक और समय के लिए स्वत: प्रारंभ और अद्यतन प्रदान करते हैं। अधिक जानकारी के लिए, Section 11.3.5, “Automatic Initialization and Updating for TIMESTAMP and DATETIME” देखें।

0

सम्मिलित और अद्यतन दिनांक/समय स्वचालित रूप से डेटा प्रकार के साथ

वर्क्स: DATETIME या TIMESTAMP

पर परीक्षण किया गया: MySQL 5.6.27-2 और MariaDB 10.1।10


स्टोर आज की तारीख और सम्मिलित में समय

CREATE TABLE table_demo (
    ... 
    `CreatedAt` datetime DEFAULT CURRENT_TIMESTAMP 
    ... 
); 

स्टोर वर्तमान दिनांक और समय सम्मिलित में और अद्यतन

CREATE TABLE table_demo (
    ... 
    `UpdatedAt` datetime EFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
    ... 
); 

स्टोर आज की तारीख और केवल समय अद्यतन में

नोट: INSERT डिफ़ॉल्ट मान कब होता है ' 0000-00-00 00:00:00 '

CREATE TABLE table_demo (
    ... 
    `UpdatedAt` datetime DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP 
    ... 
); 
0

मेरी तस्वीर देखो।

सेट स्तंभ दायर प्रकार टाइमस्टैम्प, & अतिरिक्त भी अद्यतन CURRENT_TIMESTAMP पर गुण। मेरे मामले में डेटाबेस में दायर प्रकार को बदलने के बाद कोई समस्या नहीं है। लेकिन सभी मामलों के लिए निश्चित नहीं है। enter image description here

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