webentwicklung-frage-antwort-db.com.de

Wie bekomme ich einen Wert aus der letzten eingefügten Zeile?

Gibt es eine Möglichkeit, einen Wert aus der zuletzt eingefügten Zeile zu erhalten?

Ich füge eine Zeile ein, in der die PK automatisch erhöht wird, und ich möchte diese PK erhalten. Nur der PK ist garantiert eindeutig in der Tabelle.

Ich verwende Java mit einer JDBC und PostgreSQL.

51
eflles

Mit PostgreSQL können Sie dies über das RETURNING-Schlüsselwort tun:

PostgresSQL - ZURÜCKKEHR

INSERT INTO mytable( field_1, field_2,... )
VALUES ( value_1, value_2 ) RETURNING anyfield

Es wird der Wert von "Anyfield" zurückgegeben. "anyfield" kann eine Sequenz sein oder nicht.

So verwenden Sie JDBC:

ResultSet rs = statement.executeQuery("INSERT ... RETURNING ID");
rs.next();
rs.getInt(1);
52
Luc M

Weitere Informationen finden Sie in den API-Dokumenten zu Java.sql.Statement .

Wenn Sie executeUpdate() oder executeQuery() aufrufen, verwenden Sie grundsätzlich die Konstante Statement.RETURN_GENERATED_KEYS. Sie können dann getGeneratedKeys aufrufen, um die automatisch generierten Schlüssel aller durch diese Ausführung erstellten Zeilen abzurufen. (Vorausgesetzt, Ihr JDBC-Treiber stellt es bereit.)

Es geht etwas in die Richtung davon:

Statement stmt = conn.createStatement();
stmt.execute(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet keyset = stmt.getGeneratedKeys();
28
Andrew Watt

Wenn Sie JDBC 3.0 verwenden, können Sie den Wert des PK erhalten, sobald Sie ihn eingefügt haben. 

Hier ist ein Artikel, der wie geht: https://www.ibm.com/developerworks/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);
}
16
anjanb

Seit der PostgreSQL JDBC-Treiberversion 8.4-701 ist die PreparedStatement#getGeneratedKeys() endlich voll funktionsfähig. Wir verwenden es hier fast ein Jahr in der Produktion zu unserer vollsten Zufriedenheit.

In "plain JDBC" muss die Variable PreparedStatement folgendermaßen erstellt werden, damit die Schlüssel zurückgegeben werden:

statement = connection.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);

Sie können die aktuelle JDBC-Treiberversion hier (die derzeit noch 8.4-701 ist) herunterladen.

10
BalusC

Die Sequenzen in postgresql sind transaktionssicher. Sie können also die verwenden 

currval(sequence)

Zitat:

currval

Gibt den zuletzt von nextval für diese Sequenz erhaltenen Wert zurück in der aktuellen Sitzung. (Ein Fehler ist Wurde gemeldet, wenn nextval für diese Sequenz in dieser -Sitzung noch nie Aufgerufen wurde.) Beachten Sie, dass dies Ist. Gibt einen Sitzungslokalen Wert zurück. gibt eine vorhersehbare Antwort, auch wenn andere Sitzungen führen nextval aus inzwischen.

8
svrist

So habe ich es gelöst, basierend auf den 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));
        }
7
eflles

Wenn Sie Statement verwenden, gehen Sie für Folgendes vor

//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 Folgendes vor

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);
4
Priyadharshani

Verwenden Sie Sequenzen in Postgres für ID-Spalten:

INSERT mytable(myid) VALUES (nextval('MySequence'));

SELECT currval('MySequence');

currval liefert den aktuellen Wert der Sequenz in derselben Sitzung.

(In MS SQL würden Sie @@ identity oder SCOPE_IDENTITY () verwenden.)

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

Für MyBatis 3.0.4 mit Annotations und Postgresql-Treiber 9.0-801.jdbc4 definieren Sie in Ihrem Mapper eine Schnittstellenmethode

public interface ObjectiveMapper {

@Select("insert into objectives" +
        " (code,title,description) values" +
        " (#{code}, #{title}, #{description}) returning id")
int insert(Objective anObjective);

Beachten Sie, dass @Select anstelle von @Insert verwendet wird.

0
emicklei

Verwenden Sie nicht SELECT currval ('MySequence') - der Wert wird bei fehlgeschlagenen Einfügungen erhöht.

0
smilek

Wenn Sie sich in einer Transaktion befinden, können Sie SELECT lastval() nach einer Einfügung verwenden, um die zuletzt generierte ID abzurufen.

0
mihu86

zum Beispiel:

 Verbindung conn = null; 
 PreparedStatement sth = null; 
 ResultSet rs = null; 
 Versuchen {
 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);" kein gefunden.

0
fernando

Verwenden Sie diesen 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)
0
danigonlinea