Frage

Gibt es eine Cross-Datenbank-Plattform Art und Weise den Primärschlüssel des Datensatzes erhalten Sie gerade eingefügt haben?

Ich stellte fest, dass sagt, dass Sie können es durch SELECT LAST_INSERT_ID() aufrufen, und ich denke, dass Sie SELECT @@IDENTITY AS 'Identity'; gibt es einen gemeinsamen Weg diese Datenbanken in jdbc accross tun anrufen können?

Wenn nicht, wie würden Sie vorschlagen, ich implementieren dies für ein Stück Code, der jeder von SQL Server, MySQL und Oracle zugreifen können?

War es hilfreich?

Lösung

Kopiert von meinem Code:

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

Dabei gilt pInsertOid eine vorbereitete Erklärung.

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

Hope dies gibt Ihnen einen guten Ausgangspunkt.

Andere Tipps

extraneon Antwort, obwohl korrekt, funktioniert nicht für Oracle .

Die Art und Weise Sie dies für Oracle zu 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);
}

Haben Sie die Statement.executeUpdate () und Statement.getGeneratedKeys () Methoden? Es gibt einen developer Artikel , die den Ansatz erwähnt.

Auch in JDBC 4.0 Sun hinzugefügt, um die diese .

Viel Glück!

für Orakel, Hibernate verwendet NEXT_VALUE aus einer Sequenz, wenn Sie eine Sequenz für PKEY Wertgenerierung zugeordnet haben.

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

Frühling bietet einige hilfreiche Unterstützung für diese Operation und das Referenzhandbuch scheinen Ihre Frage zu beantworten:

  

Es gibt keine Standard-Einzel Weg   schaffen eine angemessene   PreparedStatement (was erklärt, warum   die Methodensignatur ist, wie es   ist). Ein Beispiel, das auf Oracle arbeitet   und nicht auf anderen Plattformen arbeiten   ist ...

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

Für Datenbanken, die SQL-99 entsprechen, können Sie Identitätsspalten verwenden: CREATE TABLE sometable (id INTEGER immer als IDENTITY ERSTELLT (START MIT 101) PRIMARY KEY, ...

Verwenden Sie getGeneratedKeys () den Schlüssel abzurufen, die mit gerade eingefügt wurde: executeUpdate (String sql, int autoGeneratedKeys) . Verwenden Sie Statement.RETURN_GENERATED_KEYS für den 2. Parameter executeUpdate ()

Just-ID-Spalte als id integer nicht NULL Primärschlüssel auto_increment

erklären

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 aktuelle Zeile von id

Wenn Sie entfernen ds.last() als es alle Werte der Spalte id zeigen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top