टाइमस्टैम्प (ऑटो) कब अद्यतन किया जाता है?


79

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

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


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

जवाबों:


138

आज्ञा दीजिए 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कॉलम के साथ काम करता है । (MySQL संस्करण से पहले 5.6.5 यह केवल TIMESTAMPएस के साथ काम करता था ) जब आप TIMESTAMPएस का उपयोग करते हैं , तो समय क्षेत्र का हिसाब होता है: एक सही ढंग से कॉन्फ़िगर सर्वर मशीन पर, उन मूल्यों को हमेशा यूटीसी में संग्रहीत किया जाता है और रिट्रीवल पर स्थानीय समय में अनुवाद किया जाता है।


1
DEFAULT CURRENT_TIMESTAMP means that any INSERT without an explicit time stamp setting results using the current time। मेरे मामले में मेरे पास है DEFAULT CURRENT_TIMESTAMP , लेकिन पर UPDATEस्तंभ है नहीं अद्यतन किया गया। इसलिए मैं स्पष्ट नहीं हूँ कि इस वाक्य में आपका क्या मतलब है
जिम

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

हां, INSERT और UPDATE दोनों ऑपरेशंस जो टाइमस्टैम्प कॉलम का नाम देते हैं, डिफ़ॉल्ट करंट_टिमेंटैम्प बिहेवियर को ओवरराइड करेंगे।
ओ। जोन्स

1
धन्यवाद महोदय। मेरी समस्याओं का सही समाधान
एडविनफैड

phpMyAdmin का कहना है वहाँ SQL क्वेरी के साथ एक त्रुटि है "आप अपने एसक्यूएल वाक्य रचना में एक त्रुटि है, जाँच के मैनुअल है कि सही वाक्य रचना के लिए अपने सर्वर संस्करण से मेल खाती लाइन 1 में पास 'नहीं NULL डिफ़ॉल्ट CURRENT_TIMESTAMP पर अद्यतन CURRENT_TIMESTAMP' का उपयोग करने"
प्रिमो क्रालज

14

मुझे लगता है कि आपको टाइमस्टैम्प कॉलम को इस तरह परिभाषित करना होगा

TATE T1 बनाएँ 
(
    ts टाइमस्ट्रीम डिफॉल्ट CURRENT_TIMESTAMP UPDATE CURRENT_TIMESTAMP पर
);

यहाँ देखें


1
मेरा केवल हैDEFAULT CURRENT_TIMESTAMP
जिम

4

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

इसकी व्याख्या करने के लिए आइए कल्पना करें कि आपके पास केवल एक पंक्ति है:

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

अब, यदि आप निम्न अद्यतन स्तंभ चलाते हैं:

 update my_table
 set price = 2

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

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


MySQL में वर्णित व्यवहार की पुष्टि की। इसके अलावा, INSERTयदि कोई मान नहीं बदला गया है, तो इसकी गणना नहीं होती है , इसलिए पंक्ति के लिए आईडी के बजाय $this->pdo->lastInsertId()रिटर्न 0(नो इंसर्ट) जैसे PHP कॉल जिसमें डेटा समान रहता है।
OXiGEN

@OXiGEN - UPDATEनहीं है INSERT, इसलिए मैं यह उम्मीद नहीं होगा lastInsertId- एक मान होना चाहिए परवाह किए बिना कि क्या किसी भी स्तंभ परिवर्तन या नहीं की। lastInsertIdआम तौर पर केवल तब उपयोग किया जाता है जब INSERTएक नई पंक्ति में एक ऑटो-इंक्रीमेंट आईडी कॉलम होता है (यह पता लगाने के लिए कि आईडी क्या सौंपा गया था); मौजूदा पंक्तियों को बदलते समय नहीं।
टूलमेकरसिटे

3

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

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 ;

पासवर्ड बदला हुआ समय केवल तभी अपडेट होगा जब पासवर्ड कॉलम बदल जाएगा।


2

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

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

डिफ़ॉल्ट मान आप CURRENT_TIMESTAMP का चयन करें

विशेषताएँ (एक अलग ड्रॉप डाउन) आप UPDATE CURRENT_TIMESTAMP का चयन करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.