Primärschlüssel aus der eingefügten Zeile jdbc?

Gibt es eine Cross-Datenbank-Plattform, um den Primärschlüssel des Datensatzes zu erhalten, den Sie gerade eingefügt haben?

Ich habe bemerkt, dass diese Antwort besagt, dass du es bekommen kannst es durch Aufruf von SELECT LAST_INSERT_ID() und ich denke, dass Sie SELECT @@ IDENTITY AS 'Identity' aufrufen können; gibt es eine gemeinsame Möglichkeit, dies über Datenbanken in jdbc zu tun?

Wenn nicht, wie würden Sie vorschlagen, dass ich dies für einen Codeabschnitt implementiere, der auf SQL Server, MySQL und Oracle zugreifen könnte?

37

7 Antworten

Aus meinem Code kopiert:

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

pInsertOid ist eine vorbereitete Anweisung.

Sie können dann den Schlüssel erhalten:

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

Hoffe das gibt dir einen guten Startpunkt.

48
hinzugefügt
Arbeitet mit Postgres, aber nicht mit Oracle
hinzugefügt der Autor Broken_Window, Quelle
Auf Sybase ASE funktioniert das nur, wenn Sie die Metadaten-Accessor-Informationstabellen installiert haben. Andernfalls müssen Sie @@ identity verwenden.
hinzugefügt der Autor danny, Quelle

Die Antwort von extraneon ist zwar korrekt, funktioniert jedoch nicht für Oracle .

Die Art, wie Sie dies für Oracle tun, ist:

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
hinzugefügt
Arbeitete für mich mit Oracle 11g Express und Java 8.
hinzugefügt der Autor Broken_Window, Quelle
Hat funktioniert! Man sollte rs.getLong (1) besonders beachten, dass man den Index und nicht den Namen angeben muss
hinzugefügt der Autor SashikaXP, Quelle

Haben Sie versucht, Statement.executeUpdate() und Statement. getGeneratedKeys() Methoden? Es gibt einen developerWorks Artikel , in dem der Ansatz erwähnt wird.

Außerdem fügte Sun in JDBC 4.0 das Funktion row_id , mit der Sie ein eindeutiges Handle für eine Zeile erhalten können. Die Funktion wird von Oracle und DB2 unterstützt. FürSQL-serverbenötigen Sie wahrscheinlich einen Third-Party-Treiber wie diesen .

Viel Glück!

3
hinzugefügt

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

Danach diesen Code ausführen

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

Der obige Code zeigt Ihnen die ID der aktuellen Zeile

Wenn Sie ds.last() entfernen, werden alle Werte der ID-Spalte angezeigt

2
hinzugefügt

Spring bietet einige nützliche Unterstützung für Diese Operation und das Referenzhandbuch scheint Ihre Frage zu beantworten:

Es gibt keinen einheitlichen Weg   erstelle ein passendes   PreparedStatement (was erklärt warum   die Methodensignatur ist die Art und Weise   ist). Ein Beispiel, das auf Oracle funktioniert   und möglicherweise nicht auf anderen Plattformen   ist ...

Ich habe dieses Beispiel auf MySQL getestet und es funktioniert auch dort, aber ich kann nicht für andere Plattformen sprechen.

1
hinzugefügt

Für oracle verwendet Hibernate NEXT_VALUE aus einer Sequenz, wenn Sie eine Sequenz für die PKEY-Wertgenerierung zugeordnet haben.

Nicht sicher, was es für MySQL oder MS SQL Server tut

1
hinzugefügt

Für SQL-99-konforme Datenbanken können Sie Identitätsspalten verwenden: CREATE TABLE someable (ID INTEGER ERZEUGT ALS IDENTITY (START WITH 101) PRIMÄRSCHLÜSSEL, ...

Verwenden Sie getGeneratedKeys() um den Schlüssel zu erhalten, der gerade eingefügt wurde mit executeUpdate (Zeichenfolge sql, int autoGeneratedKeys) . Verwenden Sie Statement.RETURN_GENERATED_KEYS für den zweiten Parameter, um executeUpdate() auszuführen

1
hinzugefügt