Cheie primară din rândul inserat jdbc?

Există o modalitate de platformă bazată pe platforma de bază pentru a obține cheia primară a înregistrării pe care tocmai ați inserat-o?

Am observat că acest răspuns spune că puteți obține aceasta prin Calling SELECT LAST_INSERT_ID() și cred că puteți apela SELECT @@ IDENTITY AS 'Identity'; există o modalitate obișnuită de a face acest lucru în baza de date în jdbc?

Dacă nu cum v-ați sugera să pun în aplicare acest lucru pentru o bucată de cod care ar putea accesa oricare dintre SQL Server, MySQL și Oracle?

37

7 răspunsuri

Copiat din codul meu:

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

unde pInsertOid este o declarație pregătită.

puteți obține apoi cheia:

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

Sper că acest lucru vă oferă un bun punct de plecare.

48
adăugat
Lucrează cu Postgres, dar nu cu Oracle
adăugat autor Broken_Window, sursa
În cazul Sybase ASE, aceasta funcționează doar dacă ați instalat tabelele cu informații despre accesoriile metadatelor. În caz contrar, trebuie să utilizați @@ identity .
adăugat autor danny, sursa

răspunsul extraneon, deși corect, nu funcționează pentru Oracle .

Modul în care faceți acest lucru pentru Oracle este:

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
adăugat
A lucrat pentru mine cu Oracle 11g Express și Java 8.
adăugat autor Broken_Window, sursa
A lucrat! Trebuie să acordați o atenție deosebită codului rs.getLong (1) trebuie să furnizați indexul și nu numele
adăugat autor SashikaXP, sursa

Ați încercat Statement.executeUpdate() < și Declarație. metodele getGeneratedKeys() ? Există un articol dezvoltatorWorks care menționează abordarea.

De asemenea, în JDBC 4.0 Sun a adăugat caracteristică row_id care vă permite să obțineți un mâner unic pe un rând. Caracteristica este susținută de Oracle și DB2. Pentru serverul sql, probabil că veți avea nevoie de un driver terț, cum ar fi acesta .

Mult noroc!

3
adăugat

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

după ce executați acest cod

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

codul de mai sus vă va afișa id-ul rândului curent

dacă eliminați ds.last() , acesta va afișa toate valorile coloanei id

2
adăugat

Spring oferă un sprijin util pentru această operațiune și ghidul de referință pare să răspundă la întrebarea dvs.:

Nu există o cale singulară standard   creați o potrivire   PreparedStatement (care explică de ce   semnătura metodei este modul în care este   este). Un exemplu care funcționează pe Oracle   și nu pot funcționa pe alte platforme   este ...

Am testat acest exemplu pe MySQL și funcționează și acolo, dar nu pot vorbi pentru alte platforme.

1
adăugat

pentru oracle, Hibernate utilizează NEXT_VALUE dintr-o secvență dacă ați mapat o secvență pentru generarea de valori PKEY.

Nu sunteți sigur ce face pentru serverul MySQL sau MS SQL

1
adăugat

Pentru bazele de date care sunt conforme cu SQL-99, puteți utiliza coloane de identitate: CREATE TABLE (CREATE TABLE), care poate fi creat (id INTEGER GENERATĂ ÎNTOTDEAUNA CA IDENTITY (START WITH 101) PRIMARY KEY, ...

Utilizați getGeneratedKeys() pentru a prelua cheia care a fost introdusă doar cu executeUpdate (string sql, int autoGeneratedKeys) . Utilizați declarația.RETURN_GENERATED_KEYS pentru al doilea parametru pentru a executaUpdate ()

1
adăugat