Rs.last();

Bom dia a todos.

Estou tentando pegar o id de uma tabela chamada ‘pessoa’ que é auto_increment e colocar na tabela ‘pessoa_juridica’, que não é auto_increment, mas o id_pessoa é FK nesta última tabela.

Como faço pra pegar esse id incrementado pra colocar na outra tabela ?
As duas tabelas e o código do método que insere estão abaixo:

CREATE TABLE pessoa (
id_pessoa integer unsigned not null auto_increment,
nome varchar(40) not null,
fone varchar(15) not null,
tipo_pessoa enum(‘J’,‘F’) not null,
primary key (id_pessoa)
)ENGINE=InnoDB;

CREATE TABLE pessoa_juridica (
id_pessoa_jur integer unsigned not null,
nome_fant varchar(40) not null,
fundacao date not null,
cnpj varchar(15) not null,
e_clube enum(“S”,“N”) not null
)ENGINE=InnoDB;

ALTER TABLE pessoa_juridica
ADD CONSTRAINT FK_pessoa_jur FOREIGN KEY (id_pessoa_jur) REFERENCES pessoa (id_pessoa) ON UPDATE CASCADE ON DELETE CASCADE;

Codigo:

public void salvarPJuridica(String nome, String nome_fant, String fundacao, String cnpj, String fone,int clube){

final String tipo="J";
String resp="";
int num=0,num1=0;

if(clube == 0)
resp="S";
else if(clube == 1)
resp="N";

String SQL = "INSERT INTO pessoa VALUES("
+num
+",\""+nome+"\""
+",\""+fone+"\""
+",\""+tipo+"\")";

String SQL1 = "INSERT INTO pessoa_juridica VALUES("
+num1 
+",\""+nome_fant+"\""
+",\""+fundacao+"\""
+",\""+cnpj+"\"" 
+",\""+resp+"\")"; 

String SQL2 = "SELECT id_pessoa FROM pessoa ORDER BY id_pessoa";

try {
int result = stm.executeUpdate(SQL);
}catch (Exception e) {}

try{
rs=stm.executeQuery(SQL2);
rs.last();
num1=rs.getInt("id_pessoa");

}catch(Exception e){
JOptionPane.showMessageDialog(null,"ERRO - Não foi possível pegar o id_pessoa\n - "+e.toString());
}

try {
int result1 = stm.executeUpdate(SQL1);
if( result1>=1)
JOptionPane.showMessageDialog(null,"Cadastrado realizado com sucesso."); 
} catch (Exception e) {
JOptionPane.showMessageDialog(null,"ERRO - Cadastrado falhou - "+e.toString());
}
}

Você poderia mudar sua query para fazer:

String SQL2 = "SELECT max(id_pessoa) FROM pessoa";  

A função MAX do SQL retorna o maior valor da coluna especificada, logo, a última chave.

O único problema nessa solução é que se dois caras forem inseridos ao mesmo tempo no banco,
você corre o risco de pegar a chave errada.

Infelizmente deu erro na hora da inserção.

Acho que ele não pega o valor do id_pessoa com max()

select max(campo) as id from tabela

int proxcod = rs.getInt(id) + 1

naum daria pra usar somente o rs.last, pq ele só vai te dar um retorno quando for o ultimo dado do banco? e depois inserir na outra tabela?

tipo um if(rs.last)

dai ele só te retorna se o rs for o ultimo, ou seja, eh a ultima linha do banco, sendo assim, a ultima pessoa que vc inseriu, vc retorna este valor e insere na proxima tabela

É MySQL, não? Então podes fazer assim ( é um exemplo, mude para o que lhe convier ):

PreparedStatement pstmt = connection.prepareStatement("Insert into tabela ( campo ) values (?)";
pstmt.setString (1, "aaa");
pstmt.executeUpdate();
pstmt = connection.prepareStatement("Select LAST_INSERT_ID()");
ResultSet rs = pstmt.executeQuery();
if(rs.next()){
    int key = rs.getInt(1);
}
...

Ou :

[code]
PreparedStatement pstmt = connection.prepareStatement(“Insert into tabela ( campo ) values (?)”;
pstmt.setString (1, “aaa”);
pstmt.executeUpdate();
ResultSet rs = pstmt.getGeneratedKeys();

if ( rs != null && rs.next() )
{
valor = rs.getInt(1);
}[/code]

Teste aí e veja.

Até!

Obs.: nada que uma busca por “jdbc insert return last inserted id” não retornasse

Coloquei assim:

rs = stm.executeQuery(SQL2); rs.last(); num1=rs.getInt("id_pessoa");

Mas, ainda tá inserindo o valor zero

Toda vez que deleto um valor qualquer na tabela pessoa, ex: id_pessoa=4, na prox. inserção o valor era pra ser novamente 4, em vez disso ele é auto incrementado para cinco. Isso considerando o 4 como o último valor incrementado.

Está funcionando corretamente. Já pensou se você cria registros até o 10 e deleta o 6 e o 8? Qual será o próximo id de registro? 11, 6 ou 8? Já pensou se esses ids estivessem ligados em outros registros de outras tabelas e que não foram alteradas e assim criando ligações inválidas?

Outra coisa, o padrão do ResultSet é TYPE_FORWARD_ONLY, portanto, os métodos: last() e first() não irão fazer nada. Tente fazer como eu mostrei que são as maneiras mais “aprovadas” de se fazer.

Até!

Coloquei assim:

try{ PreparedStatement pstmt = con.prepareStatement("Insert into pessoa ( id_pessoa,nome,fone,tipo_pessoa ) values (0,\""+nome+"\""+",\""+fone+"\""+",\""+tipo+"\")"); pstmt.setString (1, "id_pessoa"); pstmt.executeUpdate(); ResultSet rs = pstmt.getGeneratedKeys(); if ( rs != null && rs.next() ){ num1 = rs.getInt(1); }

Mas o rs.getInt(1) não pega nada.

Aproveitando a duvida, jah que eu acabei em duvida tambem com relação ao desempenho do meu programa, gostaria de postas aki o trecho do codigo em que faz o cadastro do cliente e depois utilizando o rs.last pega este codigo (do cliente inserido) e utiliza para chamar uma segunda tabela que cadastra o banco e os debitos deste cliente:

         public void cadastrar (classecadastro obj){
           try {
         BufferedReader in = new BufferedReader(new FileReader("server.txt"));   
         String url =   in.readLine();  String usuario = in.readLine(); String senha = in.readLine();
         Class.forName("com.mysql.jdbc.Driver");
         Connection cx = DriverManager.getConnection(url,usuario,senha);    
         
         PreparedStatement ps = cx.prepareStatement("INSERT INTO clientes(cpf,rg,nome,nascimento,email,celular,telresidencial,telcomercial,endresidencial,complementores,cepresidencial," +
         "cidaderes,ufresidencial,endcomercial,complementocom,cepcomercial," +
                 "cidadecom,ufcomercial,empresa,observacoes,bairrores,bairrocom,cnpj,iestadual,fax,ramal) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
           
          
          
           ps.setString(1,obj.getCpf());             
           ps.setString(2,obj.getRg());
           ps.setString(3,obj.getNome());
             ps.setDate(4,obj.getNiver());
           ps.setString(5,obj.getEmail());
           ps.setString(6,obj.getCelular());
           ps.setString(7,obj.getTelres());
           ps.setString(8,obj.getTelcom());
           ps.setString(9,obj.getEndres());
           ps.setString(10,obj.getCompres());
           ps.setString(11,obj.getCepres());
           ps.setString(12,obj.getCidade());
           ps.setString(13,obj.getEstado());
           ps.setString(14,obj.getEndcom());
           ps.setString(15,obj.getCompcom());
           ps.setString(16,obj.getCepcom());
           ps.setString(17,obj.getCidadecom());
           ps.setString(18,obj.getEstadocom());
           ps.setString(19,obj.getEmpresa());
           ps.setString(20,obj.getObservaco());
           ps.setString(21,obj.getBairrores());
           ps.setString(22,obj.getBairrocom());
           ps.setString(23,obj.getCnpj());
           ps.setString(24,obj.getIestadual());
           ps.setString(25,obj.getFax());
            ps.setString(26,obj.getRamal()); 
           
           
           
           ps.execute();
          
                   } catch (Exception ex) {
            ex.printStackTrace();
            
        }
      try {
                //PEGA O VALOR DO CODIGO INSERIDO PARA USO DA CLASSE CADASTRA BANCO E CADASTRA DEBITOS
         
         Class.forName("com.mysql.jdbc.Driver");
         BufferedReader in = new BufferedReader(new FileReader("server.txt"));  
         String url =   in.readLine();  String usuario = in.readLine(); String senha = in.readLine();
         Class.forName("com.mysql.jdbc.Driver");
         Connection cx = DriverManager.getConnection(url,usuario,senha);
             
         
           Statement sta = cx.createStatement();
       ResultSet rs = sta.executeQuery("SELECT codigo from clientes " );
         
         if (rs.last()){         obj.setCodigo(rs.getInt("codigo")); } // verifico se eh o ultimo inserido

            } catch (Exception ex) {
            ex.printStackTrace();
           
        }  

alguem saberia me informar das chances de dar algum erro grave futuramente neste programa, como por exemplo, codigos errados serem atribuidos a clientes e trocar os dados bancarios? tenho medo disso acontecer pq li que eu posso estar pegando não o ultimo cliente inserido por mim, mas sim algum cliente que pode estar sendo cadastrado por algum outro usuario ao mesmo tempo.
Sei que o código esta bem pobre e naum otimizado, mas é que foi o primeiro envolvendo banco que fiz, mas o software cresceu tanto que fiiquei com medo de alterar algo e dafinicar mais coisas hehe

Obrigado desde jah e desculpe o tamanho do post, mas quiz colocar o trecho inteiro para ficar de mais fácil entemdimento.