Chave primária da linha inserida jdbc?

Existe uma maneira cruzada de plataforma de banco de dados para obter a chave primária do registro que você acabou de inserir?

Notei que esta resposta diz que você pode obter ele chamando SELECT LAST_INSERT_ID() e eu acho que você pode chamar SELECT @@ IDENTIDADE AS 'Identidade'; existe uma maneira comum de fazer isso através de bancos de dados em jdbc?

Se não, como você sugeriria eu implementar isso para um pedaço de código que poderia acessar qualquer um dos SQL Server, MySQL e Oracle?

37

7 Respostas

Copiado do meu código:

pInsertOid = connection.prepareStatement(INSERT_OID_SQL, Statement.RETURN_GENERATED_KEYS);

onde pInsertOid é uma declaração preparada.

você pode então obter a chave:

// fill in the prepared statement and
pInsertOid.executeUpdate();
ResultSet rs = pInsertOid.getGeneratedKeys();
if (rs.next()) {
  int newId = rs.getInt(1);
  oid.setId(newId);
}

Espero que isso lhe dê um bom ponto de partida.

48
adicionado
Funciona com o Postgres, mas não com o Oracle
adicionado o autor Broken_Window, fonte
No Sybase ASE isso simplesmente funciona se você tiver instalado as tabelas de informações do acessador de metadados. Caso contrário, você tem que usar @@ identity .
adicionado o autor danny, fonte

A resposta de extraneon, embora correta, não funciona para o Oracle .

A maneira de fazer isso para o Oracle é:

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);
}
21
adicionado
Trabalhei para mim com o Oracle 11g Express e o Java 8.
adicionado o autor Broken_Window, fonte
Trabalhou! Deve-se dar atenção especial a rs.getLong (1) você tem que fornecer o índice e não o nome
adicionado o autor SashikaXP, fonte

Você já tentou o Statement.executeUpdate() e Statement. métodos getGeneratedKeys() ? Existe um artigo do developerWorks que menciona a abordagem.

Além disso, no JDBC 4.0, a Sun adicionou o recurso row_id que permite obter um identificador exclusivo em uma linha. O recurso é suportado pelo Oracle e pelo DB2. Para o SQL Server, você provavelmente precisará de um driver de terceiros, como este .

Boa sorte!

3
adicionado

Just declare id column as id integer not NULL primary key auto_increment

depois disso executar este código

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

o código acima mostrará o id da linha atual

se você remover ds.last() , ele mostrará todos os valores da coluna id

2
adicionado

O Spring fornece algum suporte útil para esta operação e o guia de referência parecem responder à sua pergunta:

Não existe um único meio padrão para   criar um apropriado   PreparedStatement (que explica porque   a assinatura do método é a maneira que   é). Um exemplo que funciona no Oracle   e pode não funcionar em outras plataformas   é ...

Eu testei este exemplo no MySQL e ele funciona lá também, mas não posso falar por outras plataformas.

1
adicionado

Para o oracle, o Hibernate usa NEXT_VALUE de uma seqüência se você mapeou uma sequência para geração de valor PKEY.

Não tenho certeza do que ele faz para o servidor MySQL ou MS SQL

1
adicionado

Para bancos de dados que estão em conformidade com o SQL-99, você pode usar colunas de identidade: CREATE TABLE sometable (id INTEGER GENERADO SEMPRE COMO IDENTIDADE (INICIAR COM 101) PRIMARY KEY, ...

Use getGeneratedKeys() para recuperar a chave que acabou de ser inserida com executeUpdate (Sequência de caracteres sql, int autoGeneratedKeys) . Use Statement.RETURN_GENERATED_KEYS para o segundo parâmetro para executeUpdate ()

1
adicionado