2010-08-15 11 views
9

मैं कुछ टेबल बना रहा हूं जहां मैं एक समय बनाया गया था जब रिकॉर्ड बनाया गया था और जब इसे अंतिम बार अपडेट किया गया था। मैंने सोचा कि मेरे पास दो टाइमस्टैम्प फ़ील्ड हो सकते हैं जहां एक के पास मूल्य CURRENT_TIMESTAMP होगा और दूसरे के पास CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP होगा। लेकिन मुझे लगता है कि मैं ऐसा नहीं कर सकता क्योंकि आपके पास तालिका में डिफ़ॉल्ट मान के साथ केवल 1 टाइमस्टैम्प फ़ील्ड हो सकता है?MySQL समय और अद्यतन समय टाइमस्टैम्प बनाएं

आप दो बार प्राप्त करने और स्टोर करने की सलाह कैसे देंगे? धन्यवाद!

उत्तर

8

आपके पास एक तालिका में टाइपमैम्प प्रकार के दो कॉलम हो सकते हैं।

MySQL 5,0

 
create table t 
(
    id integer, 
    created_at timestamp default current_timestamp, 
    updated_at timestamp 
); 

मुझे लगता है कि आप एसक्यूएल सर्वर (जहां टाइमस्टैम्प वास्तव में एक "समय स्टाम्प" नहीं है और वहाँ वास्तव में एक एकल "टाइमस्टैम्प" कॉलम पर एक सीमा है के साथ इस भ्रमित कर रहे हैं निम्नलिखित काम करता है)

संपादित करें: लेकिन जब भी पंक्ति बदल जाती है तो आपको update_at कॉलम को अपडेट करने के लिए एक ट्रिगर की आवश्यकता होगी।

+0

यह सही है, एसक्यूएल सर्वर का टाइमस्टैम्प वास्तव में पंक्तिवर्ती – SQLMenace

+0

के लिए समानार्थी है, यह निष्पादित होगा, लेकिन अपडेट_ट फ़ील्ड को परिवर्तन पर स्वत: अद्यतन नहीं किया जाएगा। मैंने सोचा कि अद्यतन अद्यतन कॉलम पर ON UPATE CURRENT_TIMESTAMP जोड़ना उस पर ध्यान रखेगा। यही वह समय है जब यह शिकायत करता है कि यह नहीं किया जा सकता है। – Aishwar

+0

हां, जैसा कि मैंने कहा था: आपको अपडेट_एट कॉलम –

2

जहां तक ​​मुझे पता है, उस प्रतिबंध के लिए कोई कामकाज नहीं है। आपको टाइमस्टैम्प में मैन्युअल रूप से सेट (कम से कम) सेट करने की आवश्यकता होगी, सबसे आसान तरीका updated = NOW()UPDATE -query में जोड़ें।

+0

+1 पर ts_update TIMESTAMP डिफ़ॉल्ट CURRENT_TIMESTAMP से समस्या का समाधान की तरह प्रतीत होता है कि। अगर मैं इसे स्वचालित रूप से कर सकता तो मैं वास्तव में इसे प्यार करता था :) – Aishwar

+0

हालांकि ट्रिगर्स के साथ संभव हो सकता है, लेकिन मुझे लगता है कि यह एक अच्छा समाधान नहीं है। –

+0

आमतौर पर यह विपरीत होता है: आप मैन्युअल रूप से 'बनाया गया = अब() 'और' अपडेट किया गया 'स्वचालित रूप से सेट होता है।कारण यह है कि आप रिकॉर्ड 1 बार बनाते हैं लेकिन अपडेट असीमित हो सकते हैं। – Stalinko

0

आपको दो कॉलम की आवश्यकता होगी: CREATE_TIME और UPDATE_TIME।

आप CREATE_USER और UPDATE_USER जोड़ना चाहेंगे।

शायद आप 1 रखना चाहते हैं: कॉलम के नाम के साथ कई रिश्ते बदल गए, पुराने और नए मूल्य।

यह डेटा डेटा कैप्चर का एक हिस्सा है। आपके पास सीडीसी टेबल हो सकते हैं जो ट्रिगर्स का उपयोग करके अपडेट किए जाते हैं।

+0

को पॉप्युलेट करने के लिए एक ट्रिगर का उपयोग करने की आवश्यकता है मेरे पास समय बनाने और अपडेट समय स्टोर करने के लिए 2 कॉलम हैं - लेकिन मैं ऊपर बताए गए दो डिफ़ॉल्ट मान सेट नहीं कर सकता। मैं सीडीसी क्या देखूँगा। क्या इसका कोई आसान समाधान नहीं होना चाहिए? मैं छवि चाहता हूं यह एक आम परिदृश्य है। – Aishwar

+0

यह आम है, लेकिन मुझे विश्वास नहीं है कि MySQL के लिए अंतर्निहित समाधान है। ओरेकल और एसक्यूएल सर्वर करते हैं। करना मुश्किल नहीं होना चाहिए: कुछ टेबल और ट्रिगर्स। – duffymo

0

मैं आपके द्वारा सुझाए गए वर्तमान टाइमस्टैम्प को छोड़कर वर्तमान दिनांक के साथ बनाया गया दिनांक फ़ील्ड में भर दूंगा।

14

एक अच्छा तरीका की तरह 'बनाया' और 'अद्यतन' क्षेत्र बनाने के लिए

CREATE TABLE `mytable` ( 
`id` INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, 
`created` TIMESTAMP DEFAULT '0000-00-00 00:00:00', 
`updated` TIMESTAMP DEFAULT now() ON UPDATE now(), 
`myfield` VARCHAR(255) 
); 

"डालने" के दौरान दोनों स्तंभों में nulls प्रवेश करने के लिए अपने आवश्यक है और:

INSERT INTO mytable (created,updated,myfield) VALUES (null,null,'blablabla'); 

और अब, सभी अद्यतनों में, 'अपडेटेड' फ़ील्ड में वास्तविक तिथि के साथ एक नया मान होगा।

UPDATE mytable SET myfield='blablablablu' WHERE myfield='blablabla'; 

स्रोत: http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/

+2

यह मुझे मिला सबसे अच्छा समाधान है। जादू यह है कि सम्मिलन पर NULL का अनुवाद अब() में किया गया है। एक सामान्य अनुप्रयोग में, इसे बनाने के लिए पंक्ति को अपडेट करने के और तरीके होंगे, इसलिए यह एक अलग ट्रिगर या अन्य दृष्टिकोण का उपयोग करके, "अब एक" बनाने और अद्यतनों को मैन्युअल रूप से प्रबंधित करने के बजाय कम रखरखाव की तरह लगता है। – botimer

+1

अद्भुत काम किया! हालांकि मेरी स्थिति में मुझे शून्य मानों में गुजरने की आवश्यकता नहीं थी और केवल अद्यतन कॉलम बदल गया। अच्छी तरह से काम करने लगता है। 'बनाया गया समय STSTNT_P DEFAULT CURRENT_TIMESTAMP, अद्यतन_ऑन टाइमस्टैम्प DEFAULT CURRENT_TIMESTAMP अद्यतन CURRENT_TIMESTAMP पर, ... – Jordan

7

MySQL संस्करण 5.6.5 के रूप में आप इस डिफ़ॉल्ट और पर अद्यतन का उपयोग कर सकते हैं। कोई ट्रिगर्स की आवश्यकता नहीं है।

ts_create TIMESTAMP डिफ़ॉल्ट CURRENT_TIMESTAMP, अद्यतन CURRENT_TIMESTAMP

+0

अभी यह सबसे अच्छा जवाब है! – v010dya

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