2008-12-15 26 views
5

मैं निम्नलिखित हासिल करना चाहते हैं:पोस्टग्रेस्क्ल में: मैं एक साधारण काउंटर कैसे बना सकता हूं जिसे मैं रीसेट कर सकता हूं?

ID | Counter 
------------ 
0 | 343 
1 | 8344 

अब कहना है कि मैं आईडी 1 के लिए काउंटर अद्यतन करना चाहते ,,, यह करने के लिए सबसे आसान तरीका क्या है? क्या मैं अनुक्रमों का उपयोग करता हूं? क्या मैं बस मूल्य और अद्यतन पढ़ता हूं? क्या इसके लिए कोई विशेष प्रकार है?

मैं अनुक्रम का उपयोग करने के बारे में सोच रहा था लेकिन फिर मुझे प्रत्येक आईडी के लिए एक बनाना होगा (जो संभावित रूप से 1000 से अधिक हो सकता है। मुझे इस समस्या का भी सामना करना पड़ेगा कि मुझे नहीं पता कि मुझे कितने अनुक्रमों की आवश्यकता होगी, इसलिए मैं चाहता हूं यह जांचना है कि उस आईडी और इत्यादि के लिए अनुक्रम है या नहीं ... और मुझे यह नहीं चाहिए।

मान लें कि संख्याएं एक निश्चित समूह से संबंधित हैं, तो एक विकल्प जिसे मैं सोच रहा था, दर्ज करना था प्रत्येक गिनती के लिए एक पंक्ति और जब मैं संख्या प्राप्त करना चाहता हूं तो मैं आईडी या कुछ द्वारा एक चुनिंदा समूह करता हूं और पंक्तियों की संख्या प्राप्त करता हूं।

संपादित करें: स्पष्टीकरण मैं एक सीएसवी में उपयोगकर्ताओं की एक सूची प्राप्त करता हूं कि मेरा कार्यक्रम दिन में कई बार संभालता है (दिन में कई बार नया सीएसवी)। फिर इस पर निर्भर करता है कि उपयोगकर्ता ने आज एक संदेश भेजा है (उदाहरण के लिए) मैं उस समूह के काउंटर को बढ़ाता हूं जिसमें यह उपयोगकर्ता संबंधित है। अब एक निश्चित बिंदु पर मैं समूहों को निकालना चाहता हूं (जो गतिशील हो सकता है, यह उस दिन पर निर्भर करता है जो मुझे दिन के दौरान मिला) और जिस नंबर को मैंने बढ़ाया और उसे रीसेट कर दिया। उम्मीद है कि इस में इसे और अधिक बताते हैं: डी

मदद के लिए धन्यवाद अब तक, मैं प्रयोग करेंगे: डी

आप क्या सोचते हैं?

उत्तर

6

अद्यतन तालिका सेट काउंटर = काउंटर + 1 कहां आईडी =: आईडी;

:

दृश्यों मुख्य रूप से क्रमिक रूप से स्वत: पैदा आईडी मूल्यों के लिए उपयोग किया जाता है और हो सकता है (जहां 'टेबल' काउंटर के साथ तालिका निश्चित रूप से है, और पैरामीटर 'आईडी' काउंटर की आईडी है) अंतराल। उपरोक्त अद्यतन कथन परमाणु है, क्योंकि अद्यतन एक परमाणु क्रिया है। हालांकि यह नहीं कहा गया है कि यदि आप बाद में एक चुनिंदा अधिकार जारी करते हैं तो काउंटर अभी भी वही मूल्य है। यदि आप चाहते हैं, तो आपको अनुक्रमों की आवश्यकता है लेकिन फिर आप अंतराल के जोखिम को चलाते हैं।

इसलिए काउंटरों का उद्देश्य यह जानने के लिए यहां उत्तरदाताओं के लिए यह आवश्यक हो सकता है।

+1

आप 'Counter' लौटने उपयोग नहीं कर सकते अगर आप atomicity की गारंटी देता है करना चाहते हैं? – rightfold

0

यह लगता आपको क्या चाहिए की तरह बिल्कुल की तर्ज पर एक दृश्य बनाने के लिए है:

select id, count(users) from foo group by id

8

यह काफी आसान प्रतीत होता है।

वृद्धि

UPDATE Table SET Counter = Counter + 1 WHERE ID = 1 

रीसेट

UPDATE Table SET Counter = 0 WHERE ID = 1 
+0

यदि दो उपयोगकर्ता समानांतर में वृद्धि करते हैं तो इसमें कोई समस्या नहीं है? – Ced

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