UPDATE के बाद UPDATE को ट्रिगर?


13

मैं किसी भी अद्यतन के समय को रिकॉर्ड करने के लिए एक ट्रिगर बनाना चाहता हूं:

CREATE TRIGGER col_update
AFTER UPDATE ON col
FOR EACH ROW BEGIN
UPDATE col SET updated=NOW() WHERE id=NEW.id; // or OLD.id
END

समस्या यह है कि जब यह ट्रिगर updatedकॉलम को अपडेट करने की कोशिश करता है , तो यह एक अन्य अपडेट ईवेंट भी है, जो ट्रिगर चलाता है। यह एक अनंत लूप बनाएगा, जो काम नहीं करता है।

मैं अपडेट समय को संबंधित कॉलम में कैसे संग्रहीत कर सकता हूं?

मैं एक ट्रिगर का उपयोग करना चाहता हूं क्योंकि तालिका में कई कॉलम हैं। यदि मैं मैन्युअल रूप से अपडेट समय निर्धारित करने का प्रयास करता हूं, तो मुझे कई प्रश्नों को संशोधित करना होगा।

जवाबों:


17

BEFOREइसके बजाय एक ट्रिगर का उपयोग करें , और updatedएक मान असाइन करने वाले कॉलम को सेट करें NEW.updated(यह एक साधारण असाइनमेंट होगा, नहीं UPDATE)। इस तरह आप अतिरिक्त UPDATEएस को ट्रिगर नहीं करेंगे ।

आपका ट्रिगर बॉडी बस की तरह दिखेगा

SET NEW.updated = NOW()

मैं आमतौर पर नई (या अद्यतन) पंक्ति को संशोधित करने, या दबाने के लिए अन्य तालिकाओं AFTERको संशोधित करने के लिए केवल ट्रिगर का उपयोग करता हूं ।BEFOREDELETE


1

यदि आपके मामले की तरह, आप अद्यतन फ़ील्ड को हर बार रिकॉर्ड बदलना चाहते हैं, तो आपको ट्रिगर की आवश्यकता नहीं है।

आप MySQL के स्वचालित इनिशियलाइज़ेशन / अपडेट को इस तरह से उपयोग कर सकते हैं:

ALTER TABLE `yourtabelname` ADD `updated` DATETIME on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

या डॉक्स से तालिका निर्माण के समय :

CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.