2010-08-03 14 views
14

यह वास्तव में एक साधारण जैसा लगता है लेकिन मैं इसे समझने के लिए संघर्ष कर रहा हूं। मैं अपने डेटाबेस में एक कॉलम चाहता हूं जो रिकॉर्ड करता है जब एक रिकॉर्ड पहली बार बनाया गया था और दूसरा स्तंभ जो कहता है कि इसे अपडेट किया गया था। यह मेरी समझ है कि मैं बस MySQL का उपयोग करके यह सब करने में सक्षम होना चाहिए। सभी मदद की सराहना की है :)'पर बनाया गया' और 'अपडेट किया गया' फ़ील्ड

यह अभी भी बदबू आ रही है कोई जवाब नहीं, कारण मैं पहले से ही पर रूबी याद करने लगे हूँ ...

+0

pls अपने प्रश्न को elobrate, मुझे कुछ भी स्पष्ट नहीं मिला है। – nepsdotin

+1

mdgrech दो फ़ील्ड जोड़ना चाहता है जिसमें टेबल पंक्ति बनाई गई थी, और जब इसे अद्यतन किया गया था, का टाइमस्टैम्प होता है। – kiamlaluno

+6

+1 मुझे बहुत स्पष्ट लगता है –

उत्तर

7

आप शायद Datetime डेटाप्रकार के संयोजन का उपयोग करने की आवश्यकता होगी और Timestamp डेटा प्रकार। मैं created कॉलम को DateTime के रूप में DEFAULT NOW() के साथ सेट करता हूं, और updated कॉलम Timestamp के रूप में DEFAULT CURRENT_TIMESTAMP और ON UPDATE CURRENT_TIMESTAMP विशेषता के साथ सेट करेगा।

यहाँ Timestamp डीटी के लिये दस्तावेज हैं:

दोनों के साथ

:

http://dev.mysql.com/doc/refman/5.0/en/timestamp.html

एक CREATE TABLE बयान में पहले TIMESTAMP स्तंभ निम्न तरीकों में से किसी में घोषित किया जा सकता डिफॉल्ट CURRENT_TIMESTAMP और अद्यतन CURRENT_TIMESTAMP खंडों पर, कॉलम के वर्तमान मान के लिए वर्तमान टाइमस्टैम्प है, और स्वचालित रूप से अपडेट हो जाता है।

न तो DEFAULT और न ही अद्यतन खंडों के साथ, यह अद्यतन CURRENT_TIMESTAMP पर DEFAULT CURRENT_TIMESTAMP जैसा ही है।

एक डिफॉल्ट CURRENT_TIMESTAMP क्लॉज के साथ और कोई अद्यतन क्लॉज के साथ, कॉलम में इसके डिफ़ॉल्ट मान के लिए वर्तमान टाइमस्टैम्प है लेकिन स्वचालित रूप से अपडेट नहीं किया गया है।

कोई डिफ़ॉल्ट खंड नहीं है और एक अद्यतन अद्यतन CURRENT_TIMESTAMP खंड के साथ, कॉलम में 0 का डिफ़ॉल्ट है और स्वचालित रूप से अपडेट किया जाता है।

निरंतर DEFAULT मान के साथ, कॉलम को दिया गया डिफ़ॉल्ट है और स्वचालित रूप से वर्तमान टाइमस्टैम्प में प्रारंभ नहीं किया जाता है। यदि कॉलम में एक ON UPDATE CURRENT_TIMESTAMP क्लॉज भी है, तो यह स्वचालित रूप से अपडेट हो जाता है; अन्यथा, यह निरंतर डिफ़ॉल्ट है और स्वचालित रूप से अपडेट नहीं होता है।

+1

के निर्माण पर पहले फ़ील्ड को केवल कसरत करना होगा, जो मुझे पता है कि आप दोनों एक बार में उपयोग नहीं कर सकते हैं ... यदि आपके पास DEFAULT CURRENT_TIMESTAMP के साथ कोई फ़ील्ड है, तो आपके पास ON UPATE CURRENT_TIMESTAMP ईवेंट नहीं हो सकता है । '# 12 9 3 - गलत तालिका परिभाषा; DEFAULT में या UPDATE क्लॉज ' – Prix

+0

पर CURRENT_TIMESTAMP के साथ केवल एक TIMESTAMP कॉलम हो सकता है, आप सही हैं, उत्तर संपादित कर रहे हैं ... –

+0

+1: सही दृष्टिकोण - दो कॉलम जोड़ें और उचित बाधा सेट करें। –

0

यदि आप पॉल डब्ल्यू द्वारा सुझाए गए डिफ़ॉल्ट विशेषताओं वाले टाइमस्टैम्प फ़ील्ड्स का उपयोग नहीं कर सकते हैं, तो आप इन्टरनेट के बाद और फ़ील्ड को पॉप्युलेट करने के लिए अद्यतन ट्रिगर्स के बाद उपयोग कर सकते हैं।

+0

वह केवल 1 टाइमस्टैम्प फ़ील्ड का उपयोग कर सकता है जो स्वयं को mysql का उपयोग करके स्वयं पॉप्युलेट कर देगा, दूसरा को php द्वारा भरने की आवश्यकता होगी। – Prix

0

आप "निर्मित" दो क्षेत्रों की आवश्यकता होगी और प्रकार datetime के साथ "अपडेट किया गया"। जब नई प्रविष्टि डाली जाती है तो वर्तमान समय टिकट के साथ "बनाया गया" डालें। जब कोई अपडेट हो रहा है वर्तमान समय स्टाम्प, के साथ "अपडेट किया गया" और "बनाया गया" फ़ील्ड के रूप में रहने दें।

वर्तमान समय टिकट के लिए आप अपने mysql क्वेरी में अब() का उपयोग कर सकते हैं।

1

अपना प्रश्न पूरा करने के लिए और इस प्रश्न को देखने वाले अन्य लोगों के लिए, यहां जवाब है। नोट यह MySQL 5.x के लिए लिखा गया था।

DROP TABLE IF EXISTS `test1`; 
CREATE TABLE `test1` (
    `id` INT NULL AUTO_INCREMENT , 
    `name` varchar(50) NOT NULL , 
    `created` DATETIME , 
    `updated` DATETIME , 
    PRIMARY KEY (`id`), 
    INDEX (`name`) 
); 

DELIMITER $$ 
DROP TRIGGER IF EXISTS `test1_created`$$ 
CREATE TRIGGER `test1_created` BEFORE INSERT ON `test1` 
    FOR EACH ROW BEGIN 
     SET NEW.`created` = UTC_TIMESTAMP(); 
     SET NEW.`updated` = UTC_TIMESTAMP(); 
    END; 
$$ 
DROP TRIGGER IF EXISTS `test1_updated`$$ 
CREATE TRIGGER `test1_updated` BEFORE UPDATE ON `test1` 
    FOR EACH ROW BEGIN 
     SET NEW.`updated` = UTC_TIMESTAMP(); 
    END; 
$$ 
DELIMITER ; 

नोट

आप updated स्तंभ स्वचालित रूप से मूल्य इस प्रकार से पहले अद्यतन ट्रिगर की जरूरत नहीं अद्यतन कर दिया होगा जिसके लिए TIMESTAMP इस्तेमाल कर सकते हैं, हालांकि TIMESTAMP 1970 से एक श्रृंखला है 2038 के लिए जो तेजी से आ रहा है और मुझे लगता है कि मेरे अनुप्रयोग हमेशा के लिए जीना पसंद करेंगे :)। हालांकि TIMESTAMP केवल 4bytes है जबकि DATETIME 8bytes है।

TIMESTAMP range '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC

DATETIME range '1000-01-01 00:00:00' to '9999-12-31 23:59:59'

0

MySQL 5.0 प्रमाणन गाइड से:

CREATE TABLE ts_test5 (
    created TIMESTAMP DEFAULT 0, 
    updated TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    data CHAR(30) 
); 

एक टाइमस्टैम्प स्तंभ के प्रारंभ और अद्यतन व्यवहार को नियंत्रित करने के लिए, आप जोड़ना या तो या डिफ़ॉल्ट के दोनों CURRENT_TIMESTAMP और अद्यतन पर CURRENT_TIMESTAMP तालिका बनाने के साथ तालिका बनाते समय स्तंभ परिभाषा को विशेषता देता है ... और ... यदि आप डिफ़ॉल्ट CURRENT_TIMESTAMP की या अद्यतन CURRENT_TIMESTAMP पर या तो निर्दिष्ट नहीं करते विशेषताओं जब एक मेज बनाने, MySQL स्वचालित रूप से दोनों पहले TIMESTAMP स्तंभ के लिए

इसके अलावा

प्रदान करती है

आप नहीं कर सकते एक कॉलम के साथ DEFAULT CURRENT_TIMESTAMP का उपयोग करें और एक और

+0

इसके अलावा, यदि आप इस तरह से एक टेबल सेट करते हैं और फिर आप phpMyAdmin से एक नई पंक्ति डालते हैं और आप current_timestamp फ़ंक्शन निर्दिष्ट नहीं करते हैं तो समय शून्य टाइमस्टैम्प होगा। PhpMyAdmin से पंक्तियों को जोड़ने पर आपको current_timestamp निर्दिष्ट करने की आवश्यकता है। हालांकि, एसक्यूएल आवेषण और अद्यतन अपेक्षित के रूप में काम करेंगे। –

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