المفتاح الأساسي من إدراج jdbc الصف؟

هل توجد طريقة منصة قاعدة بيانات مشتركة للحصول على المفتاح الأساسي للسجل الذي قمت بإدراجه للتو؟

لقد لاحظت أن هذه الإجابة تنص على أنه يمكنك الحصول على ذلك عن طريق استدعاء SELECT LAST_INSERT_ID() وأعتقد أنه يمكنك الاتصال SELECTIDENTITY AS 'الهوية' ؛ هل هناك طريقة شائعة للقيام بذلك عبر قواعد البيانات في jdbc؟

إذا لم يكن الأمر كذلك ، كيف تقترح أن أقوم بتنفيذ ذلك للحصول على جزء من التعليمات البرمجية يمكنه الوصول إلى أي من SQL Server و 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 ASE يعمل هذا فقط إذا قمت بتثبيت جداول معلومات accessad metadata. وإلا يجب عليك استخدام هوية .
وأضاف المؤلف danny, مصدر

جواب extraneon ، على الرغم من صحته ، لا يعمل مع Oracle .

الطريقة التي تقوم بها من أجل Oracle هي:

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
وأضاف
عملت لي مع Oracle 11g Express و Java 8.
وأضاف المؤلف Broken_Window, مصدر
عمل! يجب على المرء أن يولي اهتماما خاصا rs.getLong (1) ، يجب عليك تقديم الفهرس وليس الاسم
وأضاف المؤلف SashikaXP, مصدر

هل جربت Statement.executeUpdate() و Statement. أساليب getGeneratedKeys() ؟ هناك articleWorks article الذي يشير إلى المنهج.

أيضا ، في JDBC 4.0 صن أضافت ميزة row_id تسمح لك بالحصول على مقبض فريد في الصف. الميزة مدعومة من قبل Oracle و DB2. بالنسبة لخادم SQL ، ربما تحتاج إلى برنامج تشغيل تابع لجهة خارجية مثل هذا البرنامج .

حظا طيبا وفقك الله!

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
وأضاف

يوفر الربيع بعض الدعم المفيد لـ هذه العملية ويبدو أن الدليل المرجعي يجيب على سؤالك:

لا توجد طريقة موحدة موحدة   خلق مناسبة   PreparedStatement (الذي يوضح السبب   طريقة التوقيع هي الطريقة   هو). مثال يعمل على أوراكل   وقد لا تعمل على منصات أخرى   هو ...

لقد اختبرت هذا المثال على MySQL ، وهو يعمل هناك أيضًا ، ولكن لا يمكنني التحدث عن المنصات الأخرى.

1
وأضاف

بالنسبة لـ oracle ، يستخدم Hibernate NEXT_VALUE من تسلسل إذا قمت بتعيين تسلسل لتوليد القيمة PKEY.

لست متأكدا ما يفعله لخادم MySQL أو MS SQL

1
وأضاف

بالنسبة لقواعد البيانات التي تتوافق مع SQL-99 ، يمكنك استخدام أعمدة التعريف: CREATE TABLE sometable (id INTEGER GENERATED ALAWAYS AS ASENTITY (START WITH 101) PRIMARY KEY، ...

استخدم getGeneratedKeys() لاسترداد المفتاح الذي تم إدراجه فقط باستخدام executeUpdate (String sql، int autoGeneratedKeys) . استخدم Statement.RETURN_GENERATED_KEYS للمعلمة الثانية لتنفيذ expdate ()

1
وأضاف