2011-03-25 13 views
14

उदाहरण:क्या इंसर्ट रिटर्निंग "सही" ऑर्डर में चीजों को वापस करने की गारंटी है?

create table foo(
    id serial, 
    txt text 
); 

insert into foo(txt) values ('a'),('b'),('c') returning id; 

रिटर्न:

id 
---- 
    1 
    2 
    3 
(3 rows) 

यह लगता कि पहले वापसी मान में id हमेशा 'a' के लिए id हो जाएगा, 'b' और इतने पर के लिए दूसरा, लेकिन क्या यह परिभाषित व्यवहार insert into है, या यह एक संयोग है जो अजीब परिस्थितियों में विफल हो सकता है?

उत्तर

15

मुझे the documentation में कुछ भी दिखाई नहीं देता है जो RETURNING के लिए आदेश की गारंटी देता है, इसलिए मुझे नहीं लगता कि आप इस पर निर्भर कर सकते हैं। बाधाएं हैं कि RETURNING ऑर्डर VALUES ऑर्डर से मेल खाता है लेकिन मुझे VALUES को किसी भी क्रम में डालने के बारे में कोई गारंटी नहीं दिखाई देगी; VALUES लगभग निश्चित रूप से बाएं से दाएं क्रम में डालने जा रहे हैं लेकिन फिर से, कोई दस्तावेजी गारंटी नहीं है।

इसके अलावा, रिलेशनल मॉडल सेट आधारित है इसलिए ऑर्डरिंग उपयोगकर्ता द्वारा किसी संबंध की अंतर्निहित संपत्ति के बजाय कुछ लागू होती है। आम तौर पर, अगर ऑर्डरिंग को स्पष्ट रूप से निर्दिष्ट करने का कोई तरीका नहीं है, तो कोई अंतर्निहित आदेश नहीं है।

सारांश निष्पादित करें: जो ऑर्डर आप देख रहे हैं वह शायद हमेशा क्या होगा लेकिन इसकी गारंटी नहीं है इसलिए इस पर निर्भर न हों।

+1

मुझे पता है कि संबंध अनियंत्रित हैं, लेकिन मुझे यकीन नहीं था कि 'मूल्य' भाग को संबंध या सूची के रूप में मॉडलिंग किया जाना चाहिए :) मुझे उम्मीद थी कि यह एक विशेष मामला हो सकता है, क्योंकि (ऑर्डर- स्वतंत्र) वैकल्पिक 'foo (txt) मानों में डालें (' ए '), (' बी '), (' सी ') लौटने (txt, id)' हल्के से अपमानजनक लगता है (अनुमान है कि मैं समय से पहले अनुकूलन कर रहा हूं ...) – FunctorSalad

+0

@FunctorSalad: 'मानों 'को शायद एक सूची के रूप में माना जाता है लेकिन मुझे इसे कहीं भी गारंटी नहीं दिखाई देती है।और यदि 'रिटर्निंग' से ऑर्डर से निपटना आपकी प्रदर्शन बोतल गर्दन है तो आप शायद ठीक कर रहे हैं :) –

+1

सहमत हैं, * बिल्कुल * इस पर भरोसा न करें। PostgreSQL इनपुट को सॉर्ट करने के अपने अधिकारों के भीतर अच्छी तरह से है, हालांकि परिणामस्वरूप सर्वश्रेष्ठ डालने का प्रदर्शन होगा, और अगर इंडेक्स-संगठित टेबल कभी लागू किए जाते हैं, तो शायद यह होगा। –

3

हालांकि यह आपकी मदद नहीं करेगा अब, 9.1 में "writeable common table expressions" शामिल होंगे। यह WITH syntax के लिए आधिकारिक नाम है। (Wikipedia।)

इस नई क्षमता आप एक WITH के अंदर अपने INSERT ... RETURNING जगह, एक उपनाम दे देना चाहिए, और फिर उस एक सादे पुराने ORDER BY खंड के साथ एक विशेष आदेश के साथ के खिलाफ SELECT

+2

यह दिलचस्प है, लेकिन केवल स्पर्शिक रूप से संबंधित है। इसका उपयोग ओपी पूछने के करीब अनुमान के रूप में किया जा सकता है * केवल अगर * इनपुट आदेश को एक अस्पष्ट और समकक्ष 'ऑर्डर बाय' के साथ भी व्यक्त किया जा सकता है। – Flimzy

7

जबकि प्रलेखन पूरी तरह से स्पष्ट नहीं है, यह कहा गया है कि करता है: सम्मिलित करें आदेश लौटने वाला खंड शामिल

हैं, तो परिणाम में परिभाषित किया गया एक SELECT कथन कॉलम और मान युक्त के समान हो जाएगा रिटर्निंग सूची में, कमांड द्वारा डाली गई पंक्तियों पर गणना की गई।

अब "समान करने के लिए" नहीं एक कवचयुक्त गारंटी है, और मैं raised this for discussion on the mailing list है ... लेकिन व्यवहार में, PostgreSQL RETURNING में मानों का क्रम के साथ गड़बड़ नहीं होगा। यह संभावना नहीं है कि हम कभी भी अनुकूलन के लिए भी प्रयास कर सकेंगे, क्योंकि बहुत से ऐप्स इस पर भरोसा करते हैं कि इनपुट के समान ही आदेश दिया जा रहा है।

तो ... INSERT INTO ... VALUES (...), (...), ... RETURNING ... और INSERT INTO ... SELECT ... ORDER BY ... RETURNING ... के लिए यह मानना ​​सुरक्षित होना चाहिए कि परिणाम संबंध इनपुट के समान क्रम में है।

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

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