सम्मिलित पंक्ति jdbc से प्राथमिक कुंजी?

क्या आपके द्वारा अभी दर्ज किए गए रिकॉर्ड की प्राथमिक कुंजी प्राप्त करने के लिए कोई क्रॉस डेटाबेस प्लेटफ़ॉर्म तरीका है?

मैंने नोट किया कि यह उत्तर कहता है कि आप प्राप्त कर सकते हैं इसे SELECT LAST_INSERT_ID() पर कॉल करके और मुझे लगता है कि आप SELECT @@ पहचान 'पहचान' के रूप में कॉल कर सकते हैं; jdbc में इस संपूर्ण डेटाबेस को करने का एक आम तरीका है?

यदि नहीं, तो आप कैसे सुझाव देंगे कि मैं इसे कोड के एक टुकड़े के लिए कार्यान्वित करता हूं जो किसी भी SQL सर्वर, MySQL और Oracle तक पहुंच सकता है?

37

7 उत्तर

मेरे कोड से कॉपी किया गया:

pInsertOid = connection.prepareStatement(INSERT_OID_SQL, Statement.RETURN_GENERATED_KEYS);

जहां pInsertOid एक तैयार कथन है।

फिर आप कुंजी प्राप्त कर सकते हैं:

// fill in the prepared statement and
pInsertOid.executeUpdate();
ResultSet rs = pInsertOid.getGeneratedKeys();
if (rs.next()) {
  int newId = rs.getInt(1);
  oid.setId(newId);
}

उम्मीद है कि यह आपको एक अच्छा प्रारंभिक बिंदु देता है।

48
जोड़ा
पोस्टग्रेस के साथ काम करता है, लेकिन ओरेकल के साथ नहीं
जोड़ा लेखक Broken_Window, स्रोत
Sybase एएसई पर यह सिर्फ काम करता है अगर आपने मेटाडेटा एक्सेसर सूचना तालिका स्थापित की है। अन्यथा आपको @@ पहचान का उपयोग करना होगा।
जोड़ा लेखक danny, स्रोत

extraneon का जवाब, हालांकि सही है, ओरेकल के लिए काम नहीं करता

ओरेकल के लिए आप जिस तरह से करते हैं वह है:

String key[] = {"ID"}; //put the name of the primary key column

ps = con.prepareStatement(insertQuery, key);
ps.executeUpdate();

rs = ps.getGeneratedKeys();
if (rs.next()) {
    generatedKey = rs.getLong(1);
}
21
जोड़ा
ओरेकल 11 जी एक्सप्रेस और जावा 8 के साथ मेरे लिए काम किया।
जोड़ा लेखक Broken_Window, स्रोत
काम किया! किसी को rs.getLong (1) पर विशेष ध्यान देना चाहिए, आपको इंडेक्स प्रदान करना होगा, न कि नाम
जोड़ा लेखक SashikaXP, स्रोत

क्या आपने Statement.executeUpdate() और कथन। GetGeneratedKeys() विधियां? एक डेवलपर वर्क्स लेख है जो दृष्टिकोण का उल्लेख करता है।

इसके अलावा, जेडीबीसी 4.0 सन में row_id सुविधा जो आपको एक पंक्ति पर एक अद्वितीय संभाल पाने की अनुमति देता है। सुविधा ओरेकल और डीबी 2 द्वारा समर्थित है। एसक्यूएल सर्वर के लिए आपको शायद किसी तृतीय पक्ष चालक की आवश्यकता होगी जैसे कि यह एक

सौभाग्य!

3
जोड़ा

Just declare id column as id integer not NULL primary key auto_increment

इस कोड को निष्पादित करने के बाद

ResultSet ds=st.executeQuery("select * from user");
                while(ds.next())
                {

                 ds.last();
                System.out.println("please note down your registration id  which is "+ds.getInt("id"));
                }
                ds.close();

उपर्युक्त कोड आपको वर्तमान पंक्ति की आईडी दिखाएगा

यदि आप ds.last() को हटाते हैं तो यह आईडी कॉलम के सभी मान दिखाएगा

2
जोड़ा

स्प्रिंग के लिए कुछ उपयोगी समर्थन प्रदान करता है यह ऑपरेशन और संदर्भ मार्गदर्शिका आपके प्रश्न का उत्तर देने लगती है:

एक मानक एकल तरीका नहीं है   एक उचित बनाएँ   प्रीपेडस्टेटमेंट (जो बताता है क्यों   विधि हस्ताक्षर यह तरीका है   है)। एक उदाहरण जो ओरेकल पर काम करता है   और अन्य प्लेटफार्मों पर काम नहीं कर सकता है   है ...

मैंने इस उदाहरण का परीक्षण MySQL पर किया है और यह वहां भी काम करता है, लेकिन मैं अन्य प्लेटफार्मों के लिए बात नहीं कर सकता।

1
जोड़ा

ऑरैकल के लिए, यदि आपने पीकेईई मूल्य पीढ़ी के लिए अनुक्रम मैप किया है तो हाइबरनेट अनुक्रम से NEXT_VALUE का उपयोग करता है।

यह सुनिश्चित नहीं है कि यह MySQL या MS SQL सर्वर के लिए क्या करता है

1
जोड़ा

SQL-99 के अनुरूप डेटाबेस के लिए, आप पहचान कॉलम का उपयोग कर सकते हैं: तालिका को कभी भी बनाएं (आईडी इंटेगर हमेशा पहचान के रूप में उत्पन्न (101 के साथ शुरू करें) प्राथमिक कुंजी, ...

getGeneratedKeys() उस कुंजी को पुनः प्राप्त करने के लिए जो अभी executeUpdate (स्ट्रिंग एसक्यूएल, int autoGeneratedKeys) । निष्पादित करने के लिए दूसरे पैरामीटर के लिए STATEment.RETURN_GENERATED_KEYS का उपयोग करें ()

1
जोड़ा