PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

पोस्टग्रेज plpgsql स्टैक की गहराई सीमा पार हो गई

ठीक है, यदि आप वास्तव में अपडेट पर ट्रिगर चाहते हैं, तो आप क्या कर सकते हैं यह इस ट्रिगर को कॉलम विशिष्ट के रूप में सेट करता है, ताकि इसे 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 हैं ट्रिगर, या फिर एक नई सम्मिलित/हटाई गई पंक्ति को गणना में नहीं माना जाएगा।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Psycopg2 / Python DB-API और PostgreSQL के साथ पैरामीटरयुक्त प्रश्न

  2. UTF8 एन्कोडिंग के लिए अमान्य बाइट अनुक्रम

  3. पोस्टग्रेज - एकाधिक जुड़ने के कारण मेरी क्वेरी गलत डेटा लौटा रही है

  4. रेल 5 एसक्यूएल इंजेक्शन

  5. Elasticsearch के साथ Django घास का ढेर सूचकांक का पुनर्निर्माण करते समय डेटाबेस नहीं ढूँढ सकता