Primärschlüssel aus eingefügten Zeile Jdbc?
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?
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
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