क्या Postgres अभिलेखों के सम्मिलन क्रम को संरक्षित करता है?


19

उदाहरण के लिए जब मैं क्वेरी का उपयोग कर रहा हूं जो रिकॉर्ड आईडी देता है

INSERT INTO projects(name)
VALUES (name1), (name2), (name3) returning id;

जो उत्पादन का उत्पादन:

1
2
3

क्या यह आईडी संबंधित सम्मिलित मूल्यों को इंगित करेगा?

1 -> name1
2 -> name2
3 -> name3

4
एक तरफ का वास्तविक उत्तर (जो मुझे लगता है कि नहीं है) आपको अपने प्रश्नों में निर्दिष्ट किसी भी अन्य आदेश पर भरोसा नहीं करना चाहिए।
डेसो

जवाबों:


17

इस साधारण मामले का जवाब हां है । पंक्तियों को VALUESअभिव्यक्ति में प्रदान किए गए क्रम में डाला जाता है । और यदि आपका idकॉलम एक serialप्रकार है, तो अंतर्निहित अनुक्रम से मान उसी क्रम में प्राप्त किए जाएंगे।

लेकिन यह एक कार्यान्वयन विवरण है और इसकी कोई गारंटी नहीं है। विशेष रूप से, आदेश आवश्यक रूप से WHEREशर्तों या जॉइन के साथ अधिक जटिल प्रश्नों में बनाए नहीं रखा गया है ।

यदि आपके पास एक ही समय में एक ही टेबल पर लिखने के लिए समवर्ती लेनदेन है, तो आपको अंतराल या अन्य पंक्तियाँ भी मिल सकती हैं। अकारण, लेकिन संभव है।

डेटाबेस तालिका में कोई "प्राकृतिक" आदेश नहीं है। जबकि पंक्तियों का भौतिक क्रम (जो सिस्टम कॉलमctid में परिलक्षित होता है ) शुरू में उनके सम्मिलित क्रम के अनुरूप होगा, जो किसी भी समय बदल सकता है। UPDATE, DELETE, VACUUMऔर अन्य आदेशों पंक्तियों की शारीरिक क्रम बदल सकते हैं। लेकिन इसके लिए उत्पन्न मूल्य idस्थिर हैं और किसी भी तरह से जुड़े नहीं हैं, निश्चित रूप से।


मुझे लगता है कि सर्गेई इस सवाल का अधिक उल्लेख कर रहे थे कि क्या पहली पंक्ति हमेशा आईडी = 1, दूसरी आईडी = 2 और तीसरी आईडी = 3 होगी - वास्तविक "आदेश" या पंक्तियां नहीं
a_horse_with_no_name

@a_horse_with_no_name: उत्तर देने के लिए है कि : यह एक ताजा बनाया के साथ मामला हो जाएगा serialस्तंभ - एक ही लेन-देन में आदर्श।
एरविन ब्रान्डेसटेटर

अगर सवाल "name3 की आईडी हमेशा name1 से बड़ा होगा", तो क्या यह हमेशा सही होगा? (अपने दूसरे पैराग्राफ के संबंध में)
लूलालाल

@ लालालाला: जुड़ाव और WHEREस्थितियों के साथ अधिक जटिल प्रश्नों के लिए जरूरी नहीं है । जबकि मैं सादे WHEREस्थितियों के बारे में नहीं सोच सकता हूँ जो पंक्तियों के क्रम को बदल देंगे, निश्चित रूप से जोड़ ऐसा कर सकते हैं।
इरविन ब्रैंडस्टैटर

3

एक निश्चित मामले में Erwin Brandstetter का जवाब सही नहीं हो सकता है।

हमने एक किया है INSERT INTO ... SELECT bar,baz FROM foo ORDER BY bar और हम देखते हैं कि SELECT ctid,* FROM foo तालिका में पंक्तियों के भौतिक क्रम डालने के क्रम से बिल्कुल मेल नहीं खाते हैं, ऐसा लगता है कि यह थोड़ा गड़बड़ हो गया है। ध्यान दें कि हमारी तालिका में उच्च चर डेटा आकार के साथ एक jsonb कॉलम है। डालने के दौरान प्रयोगात्मक रूप से जोंसब डेटा को छोटा करने के कारण इन्सर्ट ऑर्डर सही हो जाता है।


3
जैसा कि @Erwin ने पहले वाक्य में बताया , वह केवल उस विशेष उदाहरण में "हाँ" कह रहा है जिसे प्रश्न में संदर्भित किया गया है। जैसा कि @deszo ने अपनी टिप्पणी में कहा , कभी भी "इन्सर्ट" आदेश पर भरोसा न करें; यदि आप किसी भी उद्देश्य के लिए उस आदेश पर भरोसा कर रहे हैं, तो आपको हमेशा चयन कथन में आदेश को निर्दिष्ट करना चाहिए।
मैक्स वर्नोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.