Como obter um valor a partir da última linha inserida?

votos
50

Existe alguma maneira de obter um valor a partir da última linha inserida?

Eu estou inserindo uma linha onde a PK aumentará automaticamente, e eu gostaria de obter este PK. Apenas o PK é garantido para ser único na tabela.

Eu estou usando Java com um JDBC e PostgreSQL.

Publicado 27/10/2008 em 19:42
fonte usuário
Em outras línguas...                            


14 respostas

votos
8

As seqüências no PostgreSQL são seguros transação. Então você pode usar o

currval(sequence)

Citar:

currval

Retornar o valor obtido mais recentemente por nextval para esta seqüência na sessão atual. (Um erro é relatado se nextval nunca foi chamado para esta seqüência nesta sessão.) Note que, porque este está retornando um valor de sessão local, ele dá uma resposta previsível, mesmo que outras sessões estão executando nextval entretanto.

Respondeu 27/10/2008 em 19:44
fonte usuário

votos
1

Use seqüências em postgres para colunas id:

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

SELECT currval('MySequence');

currval irá retornar o valor atual da seqüência na mesma sessão.

(Em MS SQL, você usaria @@ identidade ou SCOPE_IDENTITY ())

Respondeu 27/10/2008 em 19:47
fonte usuário

votos
50

Com PostgreSQL você pode fazê-lo através da palavra-chave RETORNO:

PostgresSQL - RETORNO

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

Ele irá retornar o valor de "anyfield". "Anyfield" pode ser uma sequência ou não.

Para usá-lo com JDBC, fazer:

ResultSet rs = statement.executeQuery("INSERT IGNORE  ... RETURNING ID");
rs.next();
rs.getInt(1);
Respondeu 27/10/2008 em 21:13
fonte usuário

votos
28

Consulte a documentação da API para java.sql.Statement .

Basicamente, quando você chamar executeUpdate()ou executeQuery(), utilize a Statement.RETURN_GENERATED_KEYSconstante. Você pode então chamar getGeneratedKeyspara obter as chaves geradas automaticamente de todas as linhas criadas por essa execução. (Assumindo que o seu driver JDBC fornece-lo.)

Vai algo ao longo das linhas deste:

Statement stmt = conn.createStatement();
stmt.execute(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet keyset = stmt.getGeneratedKeys();
Respondeu 27/10/2008 em 22:02
fonte usuário

votos
16

Se você estiver usando JDBC 3.0, então você pode obter o valor do PK assim que você inseriu.

Aqui está um artigo que fala sobre como: 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 IGNORE  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);
}
Respondeu 27/10/2008 em 23:18
fonte usuário

votos
7

Aqui está como eu resolveu, com base nas respostas aqui:

Connection conn = ConnectToDB(); //ConnectToDB establishes a connection to the database.
String sql = "INSERT IGNORE  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));
        }
Respondeu 28/10/2008 em 12:32
fonte usuário

votos
0

Não use currval SELECIONAR ( 'MySequence') - o valor é incrementado em inserções que falham.

Respondeu 25/05/2010 em 21:22
fonte usuário

votos
10

Desde PostgreSQL JDBC driver versão 8,4-701 o PreparedStatement#getGeneratedKeys()é finalmente totalmente funcional. Vamos utilizá-lo aqui quase um ano de produção para a nossa plena satisfação.

Em "JDBC simples" as PreparedStatementnecessidades a ser criado da seguinte forma para torná-lo para devolver as chaves:

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

Você pode baixar a versão atual driver JDBC aqui (que é no momento ainda 8,4-701).

Respondeu 01/06/2010 em 22:28
fonte usuário

votos
1
PreparedStatement stmt = getConnection(PROJECTDB + 2)
    .prepareStatement("INSERT IGNORE  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();
Respondeu 07/01/2011 em 09:45
fonte usuário

votos
0

Para MyBatis 3.0.4 com anotações e motorista Postgresql 9.0-801.jdbc4 você define um método de interface em sua Mapper como

public interface ObjectiveMapper {

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

Note-se que @Seleccione é usado em vez de @Insert.

Respondeu 16/04/2011 em 21:28
fonte usuário

votos
0

por exemplo:

 Connection conn = null;
            PreparedStatement sth = nulo;
            ResultSet rs = NULL;
            experimentar {
                Conn = delegate.getConnection ();
                sth = conn.prepareStatement (INSERT IGNORO _SQL);
                sth.setString (1, pais.getNombre ());
                sth.executeUpdate ();
                rs = sth.getGeneratedKeys ();
                if (rs.next ()) {
                    ID número inteiro = (inteiro) rs.getInt (1);
                    pais.setId (id);
                }
            } 

com ,Statement.RETURN_GENERATED_KEYS);"Não foi encontrada.

Respondeu 31/05/2011 em 03:59
fonte usuário

votos
0

Use esse código simples:

// Do your insert code

myDataBase.execSQL("INSERT IGNORE  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)
Respondeu 28/06/2012 em 13:36
fonte usuário

votos
4

Se você estiver usando Statement, vá para o seguinte

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

Se você estiver usando PreparedStatement, vá para o seguinte

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);
Respondeu 01/05/2013 em 15:23
fonte usuário

votos
0

Se você estiver em uma transação que você pode usar SELECT lastval()depois de uma inserção para obter o último ID gerado.

Respondeu 03/04/2014 em 09:32
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more