2011-12-03 9 views
6

मुझे उस समय का ट्रैक रखने की आवश्यकता है जब डेटाबेस में एक पंक्ति डाली गई थी, और जिस समय इसे अंतिम बार संशोधित किया गया था।पंक्ति निर्माण और अंतिम संशोधन के लिए टाइमस्टैम्प

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

यह करने के लिए सबसे अच्छा तरीका क्या है:

create table def (
    id int, 
    creation timestamp 
    default CURRENT_TIMESTAMP, 
    modification timestamp 
    on update CURRENT_TIMESTAMP 
); 

बहरहाल, यह एक त्रुटि का उत्पादन:

मैं दो अलग-अलग कॉलम बनाते हैं, और CURRENT_TIMESTAMP का उपयोग करने की कोशिश की?

मैं संग्रहित प्रक्रिया सोच रहा हूं, लेकिन एक मानक समाधान की तलाश में हूं। मैं एक्सेस विशेषाधिकारों से भी चिंतित हूं - क्योंकि कुछ कार्यक्रम/चीजें यथासंभव टाइमस्टैम्प को छूने में सक्षम होना चाहिए।


हालांकि मैं MySQL जवाब पसंद करते हैं, अन्य RDBMS के लिए समाधान के भी सराहना कर रहे हैं!

+0

मुझे लगता है कि संशोधित टाइमस्टैम्प "गायब सुविधा" को अधिक मौजूदा MySQL संस्करणों में से एक में वर्षों के बाद तय किया गया है। – hakre

उत्तर

3

हां यह MySQL पर एक लंगड़ा सीमा है। यदि आप किसी एप्लिकेशन के माध्यम से जा रहे हैं तो आप create_at कॉलम के लिए एक समय() कॉल जोड़ सकते हैं, और अपडेट_एट कॉलम को CURRENT_TIMESTAMP का उपयोग करने दें।

$sql = "INSERT INTO my_table SET name = 'Mike', created_at = " . time(); 

मैं created_at स्तंभ पर यह करने के लिए के रूप में यह शायद updated_at स्तंभ के रूप में के रूप में अक्सर कोई असर नहीं होगा ऑप्ट-इन करेंगे।

- संपादित करें -

अभी तक बेहतर, का उपयोग MySQL के now() समारोह में बनाया। इस तरह आपको केवल mysql सर्वर के टाइमज़ोन से संबंधित होना चाहिए, न कि ऐप सर्वर और MySQL सर्वर के टाइमज़ोन।

$sql = "INSERT INTO my_table SET name = 'Mike', created_at = NOW()"; 
+1

किस बिंदु के बारे में 'CURRENT_TIMESTAMP' का उपयोग करने के लिए अच्छा बिंदु। –

+1

यदि आप गलत नहीं हैं तो आप MySQL के 'अभी()' कमांड का भी उपयोग कर सकते हैं। – Kevin

+1

@ केविन: आप सही हैं, और tbh, अब() पसंदीदा विकल्प है, इस तरह आप केवल ऐप कोड और mysql सर्वर चलाने वाले सर्वर के बजाय, MySQL सर्वर के टाइमज़ोन से निपट रहे हैं। –

2

आप एक ट्रिगर का उपयोग कर सकते हैं। एप्लिकेशन मूल्य भी सेट कर सकता है, लेकिन यदि ऐसा होता है, तो यह डेटाबेस द्वारा ओवरराइट किया जाएगा।

delimiter // 
CREATE TRIGGER def_bef_update BEFORE UPDATE ON def FOR EACH ROW BEGIN 
    SET NEW.modification = CURRENT_TIMESTAMP; 
END// 
delimiter ; 

तुम भी डेटा की जांच करने और अपने संशोधन दिनांक को अद्यतन केवल तभी महत्वपूर्ण परिवर्तन है के लिए इसका इस्तेमाल कर सकते हैं।

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