Wie einen Wert aus der letzten eingefügten Zeile zu bekommen? [Duplikat]
-
04-07-2019 - |
Frage
Diese Frage bereits eine Antwort hier:
- Wie der Einsatz ID in JDBC bekommen? 12 Antworten
Gibt es eine Möglichkeit, einen Wert aus der letzten eingefügten Zeile zu bekommen?
Ich bin Einfügen einer Zeile, in der PK automatisch erhöht wird, und ich möchte diese PK erhalten. Nur die PK ist garantiert in der Tabelle eindeutig sein.
Ich bin mit Java mit JDBC und PostgreSQL.
Lösung
Mit PostgreSQL Sie es über das RÜCKKEHR Schlüsselwort tun können:
INSERT INTO mytable( field_1, field_2,... )
VALUES ( value_1, value_2 ) RETURNING anyfield
Es wird der Wert von „anyfield“ zurückzukehren. „Anyfield“ kann eine Sequenz sein oder nicht.
Um es mit JDBC zu verwenden, tun:
ResultSet rs = statement.executeQuery("INSERT ... RETURNING ID");
rs.next();
rs.getInt(1);
Andere Tipps
, um die API-Dokumentation finden Sie für java.sql.Statement .
Grundsätzlich, wenn Sie executeUpdate()
oder executeQuery()
aufrufen, verwenden Sie die Statement.RETURN_GENERATED_KEYS
konstant. Sie können dann rufen getGeneratedKeys
, um die automatisch generierten Schlüssel aller Zeilen, die von dieser Ausführung erstellt zu bekommen. (Angenommen, Ihre JDBC-Treiber bietet es.)
Es geht etwas entlang der Linien von dieser:
Statement stmt = conn.createStatement();
stmt.execute(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet keyset = stmt.getGeneratedKeys();
Wenn Sie mit JDBC 3.0, dann können Sie den Wert des PK erhalten, sobald Sie es eingefügt.
Hier ist ein Artikel, der darüber spricht, wie: https://www.ibm .com / developer / java / library / j-jdbcnew /
Statement stmt = conn.createStatement();
// Obtain the generated key that results from the query.
stmt.executeUpdate("INSERT INTO authors " +
"(first_name, last_name) " +
"VALUES ('George', 'Orwell')",
Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
if ( rs.next() ) {
// Retrieve the auto generated key(s).
int key = rs.getInt(1);
}
Da PostgreSQL JDBC-Treiber Version 8,4-701 der PreparedStatement#getGeneratedKeys()
ist schließlich voll funktionsfähig. Wir verwenden es hier fast ein Jahr in der Produktion zu unserer vollen Zufriedenheit.
„plain JDBC“ muss die PreparedStatement
erstellt werden wie folgt zu machen, die Schlüssel zurück:
statement = connection.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);
Sie können die aktuelle JDBC-Treiber-Version herunterladen hier (die immer noch im Moment 8,4 bis 701).
Die Sequenzen in postgresql sind transaktionssicher. So können Sie die verwenden können,
currval(sequence)
currval
Gibt den Wert zuletzt durch nextval für diese Sequenz erhalten in der aktuellen Sitzung. (Ein Fehler ist, berichtet, wenn nextval nie gewesen für diese Sequenz in dieser genannt Sitzung.) Beachten Sie, dass, weil dies eine Session-lokale Wert zurückgibt, es gibt eine vorhersehbare Antwort, auch wenn andere Sitzungen ausgeführt werden nextval mittlerweile.
Hier ist, wie ich es gelöst, auf der Grundlage der Antworten hier:
Connection conn = ConnectToDB(); //ConnectToDB establishes a connection to the database.
String sql = "INSERT INTO \"TableName\"" +
"(\"Column1\", \"Column2\",\"Column3\",\"Column4\")" +
"VALUES ('value1',value2, 'value3', 'value4') RETURNING
\"TableName\".\"TableId\"";
PreparedStatement prpState = conn.prepareStatement(sql);
ResultSet rs = prpState.executeQuery();
if(rs.next()){
System.out.println(rs.getInt(1));
}
Wenn Sie Statement
verwenden, gehen Sie für das folgende
//MY_NUMBER is the column name in the database
String generatedColumns[] = {"MY_NUMBER"};
Statement stmt = conn.createStatement();
//String sql holds the insert query
stmt.executeUpdate(sql, generatedColumns);
ResultSet rs = stmt.getGeneratedKeys();
// The generated id
if(rs.next())
long key = rs.getLong(1);
Wenn Sie PreparedStatement
verwenden, gehen Sie für das folgende
String generatedColumns[] = {"MY_NUMBER"};
PreparedStatement pstmt = conn.prepareStatement(sql,generatedColumns);
pstmt.setString(1, "qwerty");
pstmt.execute();
ResultSet rs = pstmt.getGeneratedKeys();
if(rs.next())
long key = rs.getLong(1);
Verwenden Sequenzen in Postgres für id Spalten:
INSERT mytable(myid) VALUES (nextval('MySequence'));
SELECT currval('MySequence');
currval wird den aktuellen Wert der Sequenz in der gleichen Sitzung zurück.
(In MS SQL, würden Sie verwenden @@ Identität oder SCOPE_IDENTITY ())
PreparedStatement stmt = getConnection(PROJECTDB + 2)
.prepareStatement("INSERT INTO fonts (font_size) VALUES(?) RETURNING fonts.*");
stmt.setString(1, "986");
ResultSet res = stmt.executeQuery();
while (res.next()) {
System.out.println("Generated key: " + res.getLong(1));
System.out.println("Generated key: " + res.getInt(2));
System.out.println("Generated key: " + res.getInt(3));
}
stmt.close();
Sie SELECT currval nicht verwenden ( 'MySequence'.) - der Wert auf Einsätze erhöht wird, die fehlschlagen
Für Mybatis 3.0.4 mit Anmerkungen und Postgresql Treiber 9.0-801.jdbc4 Sie eine Interface-Methode in Ihrem Mapper wie
definierenpublic interface ObjectiveMapper {
@Select("insert into objectives" +
" (code,title,description) values" +
" (#{code}, #{title}, #{description}) returning id")
int insert(Objective anObjective);
Beachten Sie, dass @Select statt @Insert verwendet wird.
Beispiel:
Connection conn = null; PreparedStatement sth = null; ResultSet rs =null; try { conn = delegate.getConnection(); sth = conn.prepareStatement(INSERT_SQL); sth.setString(1, pais.getNombre()); sth.executeUpdate(); rs=sth.getGeneratedKeys(); if(rs.next()){ Integer id = (Integer) rs.getInt(1); pais.setId(id); } }
mit ,Statement.RETURN_GENERATED_KEYS);"
nicht gefunden.
Mit diesem einfachen Code:
// Do your insert code
myDataBase.execSQL("INSERT INTO TABLE_NAME (FIELD_NAME1,FIELD_NAME2,...)VALUES (VALUE1,VALUE2,...)");
// Use the sqlite function "last_insert_rowid"
Cursor last_id_inserted = yourBD.rawQuery("SELECT last_insert_rowid()", null);
// Retrieve data from cursor.
last_id_inserted.moveToFirst(); // Don't forget that!
ultimo_id = last_id_inserted.getLong(0); // For Java, the result is returned on Long type (64)
Wenn Sie in einer Transaktion sind, können Sie SELECT lastval()
nach einem Einsatz verwenden, um die zuletzt erzeugten ID zu erhalten.