2013-02-05 19 views
5

में अद्यतन कथन के लिए चुनें, मैं तालिका के रिकोर में फ़ील्ड का चयन करना चाहता हूं और इन फ़ील्ड में से केवल एक को अपडेट करना चाहता हूं। मैं कैसे कर सकता हूँ?PostgreSql

मैं यह कोशिश:

SELECT v.idvideo, v.title 
FROM video v WHERE v.schedulingflag IS FALSE AND v.errorflag IS FALSE 
ORDER BY v.idvideo LIMIT 1 FOR UPDATE ; 

UPDATE video SET schedulingflag = true; 

लेकिन इस तरह से यह सब रिकॉर्ड में क्षेत्र "schedulingflag" सेट सच!

उत्तर

12

SELECT FOR UPDATE सिंटैक्स पीजी को बताता है कि आप उन रिकॉर्ड्स को अपडेट करने जा रहे हैं और समवर्ती पहुंच के खिलाफ उन्हें लॉक कर देंगे। हालांकि आपको अभी भी लॉक किए गए विशेष रिकॉर्ड बदलने के लिए उचित UPDATE कॉल जारी करने की आवश्यकता है।

इस मामले में, बस अपने UPDATE में एक ही WHERE खंड का उपयोग करें, उदाहरण के लिए:

UPDATE video SET schedulingflag = true 
WHERE schedulingflag IS FALSE AND errorflag IS FALSE; 
+0

हाय, मैं मेज लॉक करना चाहते हैं, तो आप अपने पिछले प्रश्न देख सकते हैं? http://stackoverflow.com/questions/14707002/lock-table-in-postgresql#comment20571089_14707002 –

+0

मुझे एक नज़र आएगी, लेकिन अगर यह आपकी समस्या हल करती है तो कृपया इस उत्तर को स्वीकार करें। –

+1

नोट, कि वह अद्यतन के लिए एक LIMIT 1 का उपयोग कर रहा है, इसका आम तौर पर इसका मतलब है कि उसका क्लॉज 1 से अधिक रिकॉर्ड वापस कर सकता है। अब, चूंकि मेरे पास टेबल के लिए डीडीएल नहीं है, इसलिए उसे अपनी प्राथमिक कुंजी को अद्यतन करने के लिए जो कुछ भी करना है, उसका उपयोग करना चाहिए, उसके बाद उसे अद्यतन वीडियो एसईटी शेड्यूलफ्लैग = सच जहां आईडीवीडियो =? का उपयोग करना चाहिए। कारण यह है कि भले ही वह एक ही प्रश्न (ORDER BY/LIMIT) का उपयोग करता है, फिर भी वह एक अलग रिकॉर्ड अपडेट कर सकता है (इससे पहले एक नई आईडी डाली जा सकती है) – Rahly