अधिकांश ड्राइवर getGeneratedKeys()
. का समर्थन करते हैं RETURNING
. पर काम करके -क्लॉज क्वेरी के अंत में स्वत:जेनरेट किए गए कॉलम के साथ। PostgreSQL सभी फ़ील्ड लौटाता है क्योंकि इसमें RETURNING *
. है जो बस सभी कॉलम लौटाता है। इसका मतलब है कि जेनरेट की गई कुंजी को वापस करने के लिए सिस्टम टेबल को क्वेरी करने की आवश्यकता नहीं है यह निर्धारित करने के लिए कि कौन सा कॉलम वापस करना है, और यह नेटवर्क राउंडट्रिप्स (और क्वेरी समय) बचाता है।
यह JDBC विनिर्देश द्वारा निहित रूप से अनुमत है, क्योंकि यह कहता है :
पंक्तियों के बीच पढ़कर आप कह सकते हैं कि यह 'मुझे नहीं पता, या यह बहुत अधिक काम है, इसलिए सभी कॉलम ऑटो-जेनरेट कीज़ का सबसे अच्छा प्रतिनिधित्व करते हैं' ।
एक अतिरिक्त कारण यह हो सकता है कि यह निर्धारित करना बहुत कठिन है कि कौन से कॉलम स्वतः उत्पन्न होते हैं और कौन से नहीं (मुझे यकीन नहीं है कि यह PostgreSQL के लिए सही है)। उदाहरण के लिए जयबर्ड (फायरबर्ड के लिए जेडीबीसी ड्राइवर जिसे मैं बनाए रखता हूं) में हम सभी कॉलम भी लौटाते हैं क्योंकि फायरबर्ड में यह निर्धारित करना असंभव है कि कौन से कॉलम ऑटो-जेनरेट किए गए हैं (लेकिन हमें कॉलम नामों के लिए सिस्टम टेबल को क्वेरी करने की आवश्यकता है क्योंकि फायरबर्ड 3 और पहले के पास RETURNING *
. नहीं है )।
इसलिए हमेशा सलाह दी जाती है कि जेनरेट की गई कुंजियों को स्पष्ट रूप से क्वेरी करें ResultSet
कॉलम के नाम से और स्थिति से नहीं।
अन्य समाधान स्पष्ट रूप से कॉलम नाम या कॉलम स्थिति निर्दिष्ट कर रहे हैं जिन्हें आप String[]
या int[]
(हालांकि मुझे 100% यकीन नहीं है कि PostgreSQL ड्राइवर इसे कैसे संभालता है)।
BTW:Oracle (था?) और भी बुरा है:डिफ़ॉल्ट रूप से यह ROW_ID
देता है पंक्ति का, और आपको उस पंक्ति से (उत्पन्न) मान प्राप्त करने के लिए एक अलग क्वेरी का उपयोग करने की आवश्यकता है।