ठीक है, यदि आप वास्तव में अपडेट पर ट्रिगर चाहते हैं, तो आप क्या कर सकते हैं यह इस ट्रिगर को कॉलम विशिष्ट के रूप में सेट करता है, ताकि इसे all_books
के अपडेट पर सक्रिय न किया जा सके। , जो आपके रिकर्सन का कारण बन रहा है। कुछ इस तरह -
create trigger total2
after update of copy_id
on totalbooks
for each row
execute procedure total1();
बेशक, आप बदल सकते हैं कि कौन से कॉलम फ़ंक्शन को ट्रिगर करते हैं, मैंने अभी चुना है copy_id
क्योंकि आप यही गिन रहे हैं।
हालांकि
अगर आप count()
. के साथ अपडेट कर रहे हैं परिणाम, आप बस ट्रिगर को INSERT
. पर डाल सकते हैं और DELETE
क्रियाएँ। इस तरह जब गिनती बदलती है तो ट्रिगर सक्रिय हो जाएगा, लेकिन अपडेट द्वारा खुद को ट्रिगर नहीं किया जाएगा। // संपादित करें:चूंकि आपका sum
copies
. में सभी रिकॉर्ड की केवल एक गिनती है , यह केवल तभी बदलेगा जब कोई रिकॉर्ड डाला या अपडेट किया जाएगा, इसलिए इस ट्रिगर को अपडेट पर चलाने का वैसे भी कोई मतलब नहीं होगा।
संपादित करें:मुझे लगा कि CREATE में एक लिंक जोड़ना उपयोगी होगा ट्रिगर दस्तावेज़ीकरण . "ईवेंट" लेबल वाला अनुभाग देखें, क्योंकि यह विवरण देता है कि ईवेंट में कॉलम कैसे निर्दिष्ट करें।
नई जानकारी के लिए संपादित करें:
यह देखते हुए कि ऐसा लगता है कि आपको पूरा करने की आवश्यकता है, मुझे लगता है कि आपको अपने डेटा डिज़ाइन पर पुनर्विचार करने की आवश्यकता है, मेरा सुझाव है कि आप माता-पिता के रिश्ते का उपयोग करें (जब भी आप किसी तालिका में कई पंक्तियों पर साझा डेटा कैशिंग कर रहे हों क्योंकि वे कुछ साझा करते हैं, वह एक संकेत है कि आपको इसके बजाय एक मूल तालिका की आवश्यकता हो सकती है)।
एक books
लें तालिका जहां प्रत्येक पंक्ति एक पुस्तक (शीर्षक, लेखक, आदि) के बारे में जानकारी है, और उसके बाद एक copies
है तालिका जहां प्रत्येक पंक्ति में एक पुस्तक की एक प्रति (क्रम संख्या, अंतिम बार चेक आउट, आदि) के बारे में जानकारी होती है।
इस तरह, प्रतियों की गिनती प्राप्त करना उतना ही सरल है जितना SELECT COUNT(*) FROM copies WHERE book_id=[some book id]
.
यदि आप वास्तव में गिनती को कहीं कैश करना चाहते हैं, तो इसे books
. पर करें मेज़।
एक INSERT OR UPDATE
Create बनाएं copies
. पर ट्रिगर करें जो UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=NEW.book_id) WHERE id=NEW.book_id
.
फिर एक DELETE
बनाएं उन प्रतियों पर ट्रिगर करें जो UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=OLD.book_id) WHERE id=OLD.book_id
है
दो ट्रिगर का कारण यह है कि NEW
वेरिएबल केवल INSERT
. में उपलब्ध है या UPDATE
ट्रिगर, और OLD
केवल DELETE
. में उपलब्ध है ट्रिगर आप यह सब एक ट्रिगर के रूप में कर सकते हैं, लेकिन इसके लिए जितना मैं यहां रखना चाहता हूं उससे अधिक कोड की आवश्यकता है।
सुनिश्चित करें कि आपके सभी ट्रिगर AFTER
हैं ट्रिगर, या फिर एक नई सम्मिलित/हटाई गई पंक्ति को गणना में नहीं माना जाएगा।