2012-12-10 29 views
10

में Postgres 9.2 PL/pgSQL सरल अद्यतन मैं एक निम्न तालिका है:पाश

+----+----------+----------+ 
| id | trail_id | position | 
+----+----------+----------+ 
| 11 | 16  | NULL  | 
| 12 | 121  | NULL  | 
| 15 | 121  | NULL  | 
| 19 | 42  | NULL  | 
| 20 | 42  | NULL  | 
| 21 | 42  | NULL  | 
+----+----------+----------+ 

और मैं incrementing पूर्णांकों (माता पिता प्रति) के साथ position अद्यतन करने के लिए एक आसान तरीका के लिए देख रहा हूँ। तो बाद मैं किया हूँ, टेबल इस तरह दिखना चाहिए:

+----+-----------+----------+ 
| id | trail_id | position | 
+----+-----------+----------+ 
| 11 | 16  | 1  | 
| 12 | 121  | 1  | 
| 15 | 121  | 2  | 
| 19 | 42  | 1  | 
| 20 | 42  | 2  | 
| 21 | 42  | 3  | 
+----+-----------+----------+ 

मैं क्या लगता है कि मैं की जरूरत है, एक समारोह, कि किसी दिए गए trail के लिए सभी पंक्तियों पर लूप है, एक सरल incrementing सूचकांक है और अद्यतन करता position स्तंभ। हालांकि मैं एक पीजीएसक्यूएल नौसिखिया हूं, इसलिए मुझे यह सुनकर खुशी होगी कि ऐसा करने के सरल तरीके हैं।

समाधान मैं अभी कोशिश कर रहा हूँ इस

CREATE FUNCTION fill_positions(tid integer) RETURNS integer AS $$ 
DECLARE 
    pht RECORD; 
    i INTEGER := 0; 
BEGIN 
    FOR pht IN SELECT * FROM photos WHERE photos.trail_id = tid LOOP 
     i := i + 1; 
     UPDATE photos SET position = i WHERE id = pht.id; 
    END LOOP; 
    RETURN i; 
END; 
$$ LANGUAGE plpgsql; 

तरह लग रहा है मैं बहुत यकीन है कि यह क्लीनर हो सकता हूँ और यह कार्यों का उपयोग करने के लिए नहीं है।

+0

मैंने अपना मूल प्रश्न थोड़ा बदल दिया। शुरू में मैंने सोचा कि निष्पादन कुछ त्रुटि के कारण जम जाता है, हालांकि यह मामला नहीं था। मैं एक जीयूआई क्लाइंट का उपयोग कर रहा था, जिसका 'प्रक्रिया' तालिका को संशोधित करने का प्रयास करते समय प्रक्रियाओं में से एक को ठंडा कर दिया गया था, इसने इसे अद्यतन करने की कोशिश कर रहे किसी अन्य प्रक्रिया के लिए तालिका को लॉक कर दिया। सबकुछ ठीक है, मैंने जो समाधान पोस्ट किया है, मैं बेहतर हूं ' – ellmo

उत्तर

15

आपको इसके लिए संग्रहीत फ़ंक्शन की आवश्यकता नहीं है। आप इसे एक ही कथन के साथ कर सकते हैं।

with new_numbers as (
    select id, 
      trail_id, 
      row_number() over (partition by trail_id order by id) as position 
    from photos 
) 
update photos 
    set position = nn.position 
from new_numbers nn 
where nn.id = photos.id; 
+0

हे भगवान, मैं अपनी प्रारंभिक पोस्ट को संपादित करने की कोशिश कर रहा हूं, ताकि आपका जवाब फिट हो जाए (_ मेरी गलती है, मैंने अलग-अलग नामों का इस्तेमाल किया प्रश्न_ में), लेकिन मुझे लगता है कि आप भी अपना जवाब बदल रहे हैं :) इसके अलावा 'row_number()' विधि ने मेरे दिमाग को उड़ा दिया। यह पूर्ण है। – ellmo