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