जावा से स्क्लाइट का उपयोग कर अंतिम डाली गई आईडी प्राप्त करने का सबसे अच्छा तरीका क्या है? Google मुझे अलग-अलग उत्तर दे रहा है - कुछ कहते हैं कि अंतिम-सम्मिलित-पंक्ति का चयन करें; दूसरों ने कॉल स्टेटमेंट कहा .getGeneratedKeys()। लेने का सबसे अच्छा तरीका क्या है? (मैं सिर्फ आईडी को वापस करना चाहता हूं, अन्य आवेषणों या किसी भी चीज़ के लिए इसका उपयोग न करें।)जावा से स्क्लाइट का उपयोग कर अंतिम डाली गई आईडी प्राप्त करने का सबसे अच्छा तरीका क्या है?
उत्तर
यदि आपका जेडीबीसी ड्राइवर इसका समर्थन करता है तो getGeneratedKeys() का उपयोग करें। आप डालने के बाद खुद को कुंजी प्राप्त करने की कोशिश करने के आसपास चारों ओर मक नहीं करना चाहते हैं। यदि आपका चालक GetGeneratedKeys() का समर्थन नहीं करता है तो मुझे डालने से पहले कुंजी से अगला मान प्राप्त होगा।
या तो दृष्टिकोण एक ही सटीक SQL कथन निष्पादित करता है, लेकिन java.sql.Statement.getGeneratedKeys()
विभिन्न अंतर्निहित डेटाबेस के लिए अधिक पोर्टेबल है।
या तो sqlite3_last_insert_rowid()
सी एपीआई फ़ंक्शन या last_insert_rowid()
SQL फ़ंक्शन का उपयोग अंतिम प्रविष्टि के दौरान उत्पन्न पंक्ति को पुनर्प्राप्त करने का सही तरीका है। आप सीधे सी API तक पहुंच नहीं है, तो
SELECT function-name();
इसलिए, यदि आप एक SELECT
बयान के माध्यम से अदिश समारोह last_insert_rowid()
आह्वान कर सकते हैं:
SQLite के रूप में SQL scalar function वाक्य रचना का समर्थन करता है।
आप SQLiteJDBC कार्यान्वयन के लिए source code को देखें, तो (इस तुम क्या प्रयोग कर रहे हैं है?) आप इस वास्तव में क्या है कि JDBC आवरण के लेखक किया गया है कि देखेंगे:
ResultSet getGeneratedKeys() throws SQLException {
if (getGeneratedKeys == null) getGeneratedKeys = conn.prepareStatement(
"select last_insert_rowid();");
return getGeneratedKeys.executeQuery();
}
किस तरह से "सम्मिलित करने से पहले कुंजी से अगला मूल्य" डालने के बाद सबसे बड़ा मूल्य "से बेहतर है? दोनों में एक ही प्रकार की दौड़ की स्थिति होती है, और दोनों मोनोटोनिक, कुंजी की एकल वृद्धि पर भरोसा करते हैं। –
धारणा यह है कि सम्मिलित करने से पहले प्राप्त की गई कुंजी लक्ष्य तालिका की किसी भी क्वेरी पर आधारित नहीं होगी बल्कि कुछ प्रमुख प्रदाता से होगी। ओरेकल शब्दों में यह दोहरी से sequence_name.nextval का चयन करेगा। मैं एसक्यूएल लाइट के लिए विवरण नहीं जानता लेकिन कुछ एपीआई कॉल जो अपने स्वायत्त लेनदेन में पूरी तरह से सम्मिलित से एक कुंजी लौटाता है। उस ने कहा ... getGeneratedKeys() का उपयोग करें। –
पंक्ति = stmt.getGeneratedKeys()। GetInt (1); –