2008-10-14 7 views
34

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

मैं ध्यान दिया this answer का कहना है कि है कि आप इसे SELECT LAST_INSERT_ID() कॉलिंग द्वारा प्राप्त कर सकते हैं और मुझे लगता है कि आप SELECT @@IDENTITY AS 'Identity'; कॉल कर सकते हैं वहाँ एक आम तरीका यह JDBC में डेटाबेस पर समन्वयित करने के लिए है?

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

उत्तर

45

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

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); 
} 

आशा यह आप एक अच्छा प्रारंभिक बिंदु देता है:

आप तो कुंजी प्राप्त कर सकते हैं।

+0

पोस्टग्रेज़ के साथ काम करता है, लेकिन ओरेकल –

+0

के साथ नहीं Sybase एएसई पर यह सिर्फ काम करता है अगर आपने मेटाडेटा एक्सेसर सूचना तालिका स्थापित की है। अन्यथा आपको '@@ पहचान' का उपयोग करना होगा। – danny

1

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

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

3

आप Statement.executeUpdate() और Statement.getGeneratedKeys() तरीकों की कोशिश की है करता है? एक developerWorks article है जो दृष्टिकोण का उल्लेख करता है।

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

शुभकामनाएं!

1

स्प्रिंग this operation के लिए कुछ उपयोगी सहायता प्रदान करता है और संदर्भ गाइड अपने सवाल का जवाब देने लगता है:

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

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

1
डेटाबेस एसक्यूएल-99 के अनुरूप है, तो आप पहचान कॉलम का उपयोग कर सकते

: CREATE TABLE sometable (आईडी पूर्णांक हमेशा जेनरेट हुई पहचान के रूप में (101 के साथ शुरू) प्राथमिक कुंजी, ...

उपयोग getGeneratedKeys() पुनः प्राप्त करने के महत्वपूर्ण यह है कि सिर्फ executeUpdate(String sql, int autoGeneratedKeys) साथ डाला गया था। executeUpdate को 2 पैरामीटर के लिए Statement.RETURN_GENERATED_KEYS का उपयोग करें()

19

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); 
} 
+0

ओरेकल 11 जी एक्सप्रेस और जावा 8 के साथ मेरे लिए काम किया। –

+1

काम किया! किसी को 'rs.getLong (1)' पर विशेष ध्यान देना चाहिए, आपको इंडेक्स प्रदान करना होगा, न कि नाम – SashikaXP

-2

बस के रूप में आईडी स्तंभ घोषित आईडी पूर्णांक नहीं NULL प्राथमिक कुंजी 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(); 

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

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