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.

War es hilfreich?

Lösung

Mit PostgreSQL Sie es über das RÜCKKEHR Schlüsselwort tun können:

PostgresSQL - RÜCKKEHR

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)

Zitat:

  

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

definieren
public 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.

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