2013-09-23 7 views
38

अगर मैं प्रकार TIMESTAMP की एक तालिका में किसी स्तंभ है और डिफ़ॉल्ट के रूप में दिया गया है: CURRENT_TIMESTAMP यह कॉलम वर्तमान टाइमस्टैम्प से अपडेट कर दिया है कि अगर मैं मूल्य की एक ही पंक्ति में किसी भी अन्य स्तंभ को अद्यतन?
ऐसा लगता है कि यह नहीं है लेकिन मुझे यकीन नहीं है कि यह क्या होना चाहिए। ,एक टाइमस्टैम्प (ऑटो) कब अपडेट किया गया है?

स्तंभ ऑटो-अपडेट किया है यह स्वचालित रूप से वर्तमान टाइमस्टैम्प को अद्यतन किया जाता है जब पंक्ति में किसी भी अन्य स्तंभ के मूल्य से बदल गई है:
मुझे समझ में नहीं कर सकते कि इसका क्या मतलब (from MySQL documentation) इसका वर्तमान मूल्य कॉलम अपरिवर्तित बनी हुई है अगर सभी अन्य कॉलम उनके वर्तमान मानों पर सेट हैं। कॉलम को अन्य कॉलम बदलने पर अपडेट करने से रोकने के लिए, इसे स्पष्ट रूप से वर्तमान मान पर सेट करें। स्तंभ भी अद्यतन करने के लिए जब अन्य स्तंभों परिवर्तन नहीं करते हैं, स्पष्ट रूप से मूल्य के लिए सेट यह] 2

+1

आपने 'टेस्ट' टेबल बनाकर और नमूना डेटा अपडेट करके ऐसा क्यों नहीं किया है। वैसे यह अद्यतन में 'टाइमस्टैम्प' टाइप किए गए कॉलम को अपडेट नहीं करता है। यदि यह कॉलम परिभाषा 'ON UPDATE CURRENT_TIMESTAMP' –

उत्तर

57

आदेश SHOW CREATE TABLE whatever

फिर तालिका परिभाषा को देखने दीजिए।

यह शायद इस

logtime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
उस में

तरह की एक पंक्ति है। DEFAULT CURRENT_TIMESTAMP का अर्थ है कि किसी भी समय INSERT बिना किसी स्पष्ट टाइम स्टैम्प सेटिंग के वर्तमान समय का उपयोग करता है। इसी तरह, ON UPDATE CURRENT_TIMESTAMP का अर्थ है कि एक स्पष्ट टाइमस्टैम्प के बिना किसी भी अपडेट को वर्तमान टाइमस्टैम्प मान के अपडेट में परिणाम मिलता है।

आप अपनी तालिका बनाते समय इस डिफ़ॉल्ट व्यवहार को नियंत्रित कर सकते हैं।

या, यदि टाइमस्टैम्प कॉलम पहले स्थान पर सही ढंग से नहीं बनाया गया था, तो आप इसे बदल सकते हैं।

ALTER TABLE whatevertable 
    CHANGE whatevercolumn 
      whatevercolumn TIMESTAMP NOT NULL 
          DEFAULT CURRENT_TIMESTAMP 
          ON UPDATE CURRENT_TIMESTAMP; 

इससे आपके टाइमस्टैम्प कॉलम को अपडेट करने के लिए स्वचालित रूप से तालिका में INSERT और UPDATE संचालन दोनों का कारण बन जाएगा। आप टाइमस्टैम्प बदले बिना whatevertable अद्यतन करने के लिए चाहते हैं, कि, जब अन्य स्तंभों को बदलने

तो आप अद्यतन के इस प्रकार जारी करने की आवश्यकता

अद्यतन करने से स्तंभ को रोकने के लिए है।

UPDATE whatevertable 
    SET something = 'newvalue', 
     whatevercolumn = whatevercolumn 
WHERE someindex = 'indexvalue' 

और, इस TIMESTAMP स्तंभ केवल, नहीं DATETIME या DATE कॉलम के साथ काम करता है। चूंकि कॉलम TIMESTAMP s हैं, समय क्षेत्र को इसके लिए जिम्मेदार माना जाता है: सही ढंग से कॉन्फ़िगर किए गए सर्वर मशीन पर, वे मान हमेशा यूटीसी में संग्रहीत होते हैं और पुनर्प्राप्ति पर स्थानीय समय में अनुवादित होते हैं।

+0

आह है! वास्तव में इसमें केवल 'DEFAULT CURRENT_TIMESTAMP' है। 'UPDATE' भाग – Jim

+0

' DEFAULT CURRENT_TIMESTAMP का अर्थ यह नहीं है कि किसी भी समय INSERT बिना किसी स्पष्ट समय स्टैम्प सेटिंग के परिणाम वर्तमान समय का उपयोग कर रहे हैं। मेरे मामले में मेरे पास 'DEFAULT CURRENT_TIMESTAMP' * है लेकिन * 'अद्यतन' पर कॉलम * अपडेट नहीं किया गया है। इसलिए मैं स्पष्ट नहीं हूं कि इस वाक्य में आपका क्या मतलब है – Jim

+0

मेरा संपादन देखें जहां मैंने स्पष्टीकरण देने की कोशिश की थी। INSERT और अद्यतन डिफ़ॉल्ट व्यवहार अलग से नियंत्रित किया जाता है। –

8

मुझे लगता है कि आप here देखें इस

 
CREATE TABLE t1 
(
    ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
); 

तरह टाइमस्टैम्प स्तंभ निर्धारित करने की होनी चाहिए

+1

में जोड़ा नहीं गया है तो मेरा केवल' DEFAULT CURRENT_TIMESTAMP' – Jim

0

UPDATE CURRENT_TIMESTAMP कहां मिलना है क्योंकि नए लोगों के लिए यह एक भ्रम है।

अधिकांश लोग phpmyadmin या ऐसा कुछ उपयोग करेंगे।

डिफ़ॉल्ट मूल्य आप CURRENT_TIMESTAMP

गुण का चयन करें (नीचे एक अलग ड्रॉप) आपके द्वारा चुने गए अद्यतन CURRENT_TIMESTAMP

1

डेटाबेस में एक ट्रिगर जोड़ें:

DELIMITER // 
CREATE TRIGGER update_user_password 
    BEFORE UPDATE ON users 
    FOR EACH ROW 
    BEGIN 
     IF OLD.password <> NEW.password THEN 
     SET NEW.password_changed_on = NOW(); 
     END IF; 
    END // 
DELIMITER ; 

पासवर्ड समय केवल अद्यतन करेगा बदल जब पासवर्ड कॉलम बदल जाता है।

0

एक ऑटो-अपडेटेड कॉलम स्वचालित टाइमस्टैम्प पर स्वचालित रूप से अपडेट हो जाता है जब पंक्ति में किसी अन्य कॉलम का मान उसके वर्तमान मान से बदल जाता है। एक अन्य अद्यतन कॉलम अपरिवर्तित बनी हुई है यदि अन्य सभी कॉलम उनके वर्तमान मानों पर सेट हैं।

यह मान लें कि केवल एक पंक्ति है चलो व्याख्या करने के लिए:

update my_table 
set price = 2 

यह, updated_at का मूल्य नहीं बदलेगा के बाद से:

------------------------------- 
| price | updated_at   | 
------------------------------- 
| 2 | 2018-02-26 16:16:17 | 
------------------------------- 

अब, आप निम्न अद्यतन स्तंभ चलाते हैं मूल्य मूल्य वास्तव में नहीं बदला गया था (यह पहले से ही 2 था)।

लेकिन यदि आपके पास 2 से अधिक मूल्य मूल्य के साथ एक और पंक्ति है, तो उस पंक्ति का अद्यतन_at मान (मूल्य <> 3 के साथ) CURRENT_TIMESTAMP को अपडेट किया जाएगा।

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