mysql अब () के साथ कई कॉलम अपडेट करें


87

मुझे mysql संस्करण 4.1.20 का उपयोग करते हुए 2 डेटाटाइम कॉलम अपडेट करने की आवश्यकता है, और मुझे उनकी बिल्कुल वैसी ही आवश्यकता है। मैं इस क्वेरी का उपयोग कर रहा हूं:

mysql> update table set last_update=now(), last_monitor=now() where id=1;

यह सुरक्षित है या एक मौका है कि कॉलम अलग-अलग समय के साथ अपडेट हैं, क्योंकि 2 दृश्यमान कॉल हैं now()?
मुझे नहीं लगता कि यह विभिन्न मूल्यों के साथ अद्यतन किया जा सकता है (मुझे लगता है कि आंतरिक रूप से mysql कॉल now()केवल एक बार प्रति पंक्ति या कुछ इसी तरह की है), लेकिन मैं एक विशेषज्ञ नहीं हूं, आपको क्या लगता है?

अपडेट: दूसरा प्रश्न निकाला गया था यहाँ


1
मेरा सुझाव है कि आप अपने दूसरे प्रश्न को यहां से हटा दें, और अंततः इसे एक अलग पोस्ट में दोहराएं।
कूर

जवाबों:


144

एक समाधान मिला:

mysql> UPDATE table SET last_update=now(), last_monitor=last_update WHERE id=1;

मैंने इसे MySQL डॉक्स में पाया और कुछ परीक्षणों के बाद यह काम करता है:

निम्न कथन कॉल 2 को वर्तमान (अपडेट) कॉल 1 मान पर सेट करता है, न कि मूल कॉल 1 मान पर। परिणाम यह है कि col1 और col2 का मान समान है। यह व्यवहार मानक SQL से भिन्न होता है।

UPDATE t1 SET col1 = col1 + 1, col2 = col1;


वहाँ कोई रास्ता नहीं है कि यह काम नहीं करेगा? एक प्रक्रिया में या अस्थायी तालिकाओं के साथ शामिल होने का उपयोग कर?
सोहिल रहसाज़

7

मैसकल बहुत चालाक नहीं है। जब आप एक से अधिक अपडेट में एक ही टाइमस्टैम्प का उपयोग करना चाहते हैं या क्वेरी डालना चाहते हैं, तो आपको एक चर घोषित करने की आवश्यकता है।

जब आप now()फ़ंक्शन का उपयोग करते हैं, तो सिस्टम हर बार वर्तमान टाइमस्टैम्प को कॉल करेगा जब आप इसे किसी अन्य क्वेरी में कहते हैं।


5

MySQL स्टेटमेंट का निष्पादन शुरू होने पर अब प्रति बार () एक बार मूल्यांकन करता है। इसलिए अब प्रति कथन कई बार दिखाई देना सुरक्षित है।

select now(); select now(), sleep(10), now(); select now();
+---------------------+
| now()               |
+---------------------+
| 2018-11-05 16:54:00 |
+---------------------+
1 row in set (0.00 sec)

+---------------------+-----------+---------------------+
| now()               | sleep(10) | now()               |
+---------------------+-----------+---------------------+
| 2018-11-05 16:54:00 |         0 | 2018-11-05 16:54:00 |
+---------------------+-----------+---------------------+
1 row in set (10.00 sec)

+---------------------+
| now()               |
+---------------------+
| 2018-11-05 16:54:10 |
+---------------------+
1 row in set (0.00 sec)

1

अद्यतन क्वेरी चलाने से पहले आप एक चर में अब () का मान संग्रहीत कर सकते हैं और फिर उस चर का उपयोग दोनों क्षेत्रों last_updateऔर अद्यतन करने के लिए कर सकते हैं last_monitor

यह अब सुनिश्चित करेगा () केवल एक बार निष्पादित किया गया है और उसी मूल्य को आपके द्वारा आवश्यक दोनों स्तंभों पर अपडेट किया गया है।


1

आप टाइमस्टैम्प कॉलम के डिफ़ॉल्ट मूल्य पर निम्न कोड डाल सकते हैं: CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPइसलिए अपडेट पर दोनों कॉलम समान मान लेते हैं।


1
AFAIK "अपडेट पर" प्रति तालिका एक स्तंभ की सीमा है, इसलिए इसे दोनों स्तंभों पर सेट नहीं किया जा सकता है।
रादू मारिस

0

यदि आपको वास्तव में यह सुनिश्चित करने की आवश्यकता है कि आपके now()पास समान मूल्य हैं, तो आप दो प्रश्नों को चला सकते हैं (जो आपके दूसरे प्रश्न का भी उत्तर देंगे, उस स्थिति में जो आप पूछ रहे हैं, update last_monitor = to last_updateलेकिन last_updateअभी तक अपडेट नहीं किया गया है)

आप कुछ ऐसा कर सकते हैं:

mysql> update table set last_update=now() where id=1;
mysql> update table set last_monitor = last_update where id=1;

वैसे भी मुझे लगता है कि mysql now()केवल एक बार प्रति प्रश्न पूछने के लिए पर्याप्त चतुर है ।


कैसे दो अपडेट के बारे में? क्या आपको भी लगता है कि mysql उन्हें एक बयान में संयोजित करने के लिए पर्याप्त स्मार्ट है? क्योंकि यह अभ्यस्त है।
राफेल हर्स्कोविसी

0

इसके 2 तरीके हैं;

सबसे पहले , मैं आपको सलाह दूंगा कि आप इसे अब () को sql स्टेटमेंट में इंजेक्ट करने से पहले एक चर के रूप में घोषित करें। हम कहते हैं;

var x = now();
mysql> UPDATE table SET last_update=$x, last_monitor=$x WHERE id=1;

तार्किक रूप से यदि आप last_monitor के लिए एक अलग इनपुट चाहते हैं तो आप एक और वैरिएबल जैसे जोड़ देंगे;

var y = time();
mysql> UPDATE table SET last_update=$x, last_monitor=$y WHERE id=1;

इस तरह से आप केवल mysql स्टेटमेंट्स में ही नहीं बल्कि सर्वर-साइड स्क्रिप्टिंग-लैंग्वेज (जैसे PHP) में अपने प्रोजेक्ट में इस्तेमाल कर रहे हैं, आप जितनी बार चाहें उतने वेरिएबल का इस्तेमाल कर सकते हैं। याद रखें कि इन समान चरों को एप्लिकेशन के फ्रंट-एंड पर एक फॉर्म में इनपुट के रूप में डाला जा सकता है। यह परियोजना को गतिशील बनाता है और स्थिर नहीं है।

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


एसओ में आपका स्वागत है। यद्यपि यह समस्या का समाधान है, लेकिन यह वास्तव में इस सवाल का जवाब नहीं देता है कि "क्या mysql बिल्ट-इन (अब) फ़ंक्शन का उपयोग करने में कोई समस्या है?"। इसके अलावा, आप बाहरी भाषा का उपयोग करने का सुझाव देते हैं जिसका पोस्टर पर कोई नियंत्रण नहीं हो सकता है। आपका दूसरा सुझाव मैं अनिश्चित हूँ (mysql का मेरा स्मरण विस्तृत नहीं है) लेकिन कुछ डॉक्स / उदाहरणों के लिंक के साथ इसका समर्थन करना कहीं अधिक विश्वसनीयता देगा।
मार्टिन

मेरे दूसरे सुझाव में, यदि अब () किसी भी अपडेट के लिए टाइमस्टैम्प के रूप में उपयोग किया जाना है, तो निम्न लिंक मदद कर सकता है; alvinalexander.com/mysql/… मेरे 1 सुझाव में, mysql तालिका में प्रत्येक स्तंभ स्वतंत्र है। इसलिए डेटा इनपुट (जैसे ऊपर दिए गए प्रश्न में एक चर का उपयोग करना) स्वतंत्र रूप से किया जाता है। हालाँकि आप संचालक जैसे>, <, =, =; =! <! इसका मतलब है कि आप इस तरह से कोल में इनपुट डेटा नहीं कर सकते हैं; mysql> अपडेट टेबल सेट last_update = last_monitor = now () जहां id = 1;
वाहिन्या ब्रायन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.