GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Como pegar uma chave primária de um Banco de Dados MySQL?


#1

Por Favor será que alguém poderia me
dar uma ajuda? Eu não estou conseguindo
pegar a chave primária da minha tabela
endereco:

CREATE TABLE Endereco (
  idEndereco INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  rua VARCHAR(20) NOT NULL,
  numero INTEGER UNSIGNED NOT NULL,
  bairro VARCHAR(30) NOT NULL,
  cidade VARCHAR(20) NOT NULL,
  estado VARCHAR(20) NOT NULL,
  cep VARCHAR(9) NULL,
  uf VARCHAR(2) NULL,
  PRIMARY KEY(idEndereco)
)
TYPE=InnoDB;

Mas eu não estou conseguindo retornar
a chave primária idEndereco através do meu
código Java:

public int salvarEndereco(Endereco endereco) throws LAFQADaoException {
        PreparedStatement ps = null;
        Connection conn = null;
        if (endereco == null)
            throw new LAFQADaoException("o valor passado não pode ser lido");
        try {
            String sql = "INSERT INTO endereco(rua, numero, bairro, " +
                    "cidade, estado, cep, uf)"
                    + "VALUES(?,?,?,?,?,?,?)";
            conn = this.conn;
            ps = conn.prepareStatement(sql);
            ps.setString(1, endereco.getRua());
            ps.setInt(2, endereco.getNumero());
            ps.setString(3, endereco.getBairro());
            ps.setString(4, endereco.getCidade());
            ps.setString(5, endereco.getEstado());
            ps.setString(6, endereco.getCep());
            ps.setString(7, endereco.getUf());           
            //Retorna o id do endereco cadastrado
            ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            ps.executeUpdate();
            ResultSet rs = ps.getGeneratedKeys();
            rs.next();
            int id = rs.getInt(1);
            rs.close();
            //Não retorna o idEndereco, como eu devo fazer para retornar
            //a chave primária?
            return id;
        }
        catch (Exception sqle) {
            throw new LAFQADaoException("Erro ao inserir dados" + sqle);
        } finally {
            try {
                ConnectionFactory.closeconnection(conn, ps);
            }
            catch (SQLException ex) {
                Logger.getLogger(ProdutorDao.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

[]'s.


#2

Por Favor será que alguém poderia me ajudar? :roll:

[]'s.


#3

Bom... Você vai executar esse SQL:

 String sql = "INSERT INTO endereco(rua, numero, bairro, cidade, estado, cep, uf) VALUES(?,?,?,?,?,?,?)";

//Se Id for a coluna 1, esse seu código está errado:
//int id = rs.getInt(1);  
//Teria de ser esse:
int id = rs.getInt(0);

#4

coloca o rs.next() (linha30) em um if pra ver se é verdadeiro, e da um system.out ali só pra teste...

caso não esteja entrando no if provavelmente seu campo na tabela do mysql não é auto_increment, se tiver entrando, disconfio também que vc possa precisar de um long, ja que o integer do banco é unsigned... ai vc da um nextLong na linha 31 ao invéz de nextInt...

faz esses testes e volta aki pra ver dizer se funciono... :wink:


#5

Jóia pedroroxd e maior_abandonado?
obrigado pela ajuda de vc's mas ainda eu não consegui,

eu troquei a parte do código para:

int id = rs.getInt(0);

e coloquei um if para testar:

   if(rs.next()){
       System.out.println("rs.next() é verdadeiro!");
    }

e descobrir que o campo do idEndereco é AUTO_INCREMENT sim,
mas do mesmo jeito com todos os testes feito aparece a seguinte Exceção:

java.sql.SQLException: No value specified for parameter 1
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
Falha ao cadastrar o usuário!
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
        at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2176)
        at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1993)
        at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1937)
        at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1922)
        at dao.EnderecoDao.salvarEndereco(EnderecoDao.java:57)
        at teste.TesteEndereco.main(TesteEndereco.java:38)
22/09/2009 10:00:20 teste.TesteEndereco main
SEVERE: null
dao.LAFQADaoException: Erro ao inserir dadosjava.sql.SQLException: No value specified for parameter 1
        at dao.EnderecoDao.salvarEndereco(EnderecoDao.java:72)
        at teste.TesteEndereco.main(TesteEndereco.java:38)
CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)

Obrigado pela ajuda pedroroxd e maior_abandonado,
mas será que um de vc's dois ou alguém sabe o que eu devo
ter feito de errado?

[]'s.


#6

Eu tô quase fazendo uma consulta
SELECT para pegar a chave primária
atual gerada pelo AutoIncrement do Banco.
Se bem que isso não vai ser eficiente,
mas não estou conseguindo cadastrar
um endereço novo no banco e retornar
a chave primária gerada por aquele
novo endereço.


#7

Mas como eu posso fazer esse SELECT tb?
Será que alguém poderia me dar uma ajuda?

[]'s.


#8

Using AUTO_INCREMENT keys with Connector/J 3.0

Dá a impressão que você fez as coisas certo (exceto pelo fato de você não testar o "next"). Mas dê uma lida no artigo acima.


#9

Da uma olhada:
http://www.google.com.br/search?q=mysql+get+last+id&ie=utf-8&oe=utf-8&aq=t&rlz=1R1GGGL_pt-BR___BR345&client=firefox-a

o primeiro link explica, o terceiro tem um exemplo de uso.

[]´s


#10

Olá enantiomero e jgbt,
obrigado pela ajuda mas
pelo jeito eu não estou conseguindo,
já fiz várias alterações aqui
com o material que vc's me passaram
mas agora apareceu um NullPointerException
e não sei aonde está o problema
o código depois da alteração
que vc's me falaram ficou assim:

public int salvarEndereco(Endereco endereco) throws LAFQADaoException {
        PreparedStatement ps = null;
        Statement stmt = null;
        ResultSet rs = null;
        if (endereco == null)
            throw new LAFQADaoException("o valor passado não pode ser lido");
        try {
            String sql = "INSERT INTO endereco(rua, numero, bairro, " +
                    "cidade, estado, cep, uf)"
                    + "VALUES(?,?,?,?,?,?,?)";
            ps = conn.prepareStatement(sql);
            ps.setString(1, endereco.getRua());
            ps.setInt(2, endereco.getNumero());
            ps.setString(3, endereco.getBairro());
            ps.setString(4, endereco.getCidade());
            ps.setString(5, endereco.getEstado());
            ps.setString(6, endereco.getCep());
            ps.setString(7, endereco.getUf());              
            ps.executeUpdate();
            int autoIncKeyFromFunc = -1;
            rs = stmt.executeQuery("SELECT LAST_INSERT_ID()");
            if (rs.next()) {
                autoIncKeyFromFunc = rs.getInt(1);
            }
            else {
                throw new LAFQADaoException("Erro ao pegar a chave primaria");
            }
            rs.close();
            System.out.println("Key returned from " +
                               "'SELECT LAST_INSERT_ID()': " +
                               autoIncKeyFromFunc);
            return autoIncKeyFromFunc;
        }
        catch (Exception sqle) {
            sqle.printStackTrace();
            throw new LAFQADaoException("Erro ao inserir dados" + sqle);
        }
        finally {
            try {
                ConnectionFactory.closeconnection(conn, ps);
            }
            catch (SQLException ex) {
                Logger.getLogger(ProdutorDao.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

Estou precisando de ajuda
não estou mesmo conseguindo resolver este problema.
Por favor pessoal.
[]'s.


#11

Faaaaaaala Ricardo! hahah
Quem diria, colegas de sala topando no fórum. Maaaasssa!

Aqui, cola pra gente onde está dando o NullPointerException. Em qual linha que está ocorrendo o Null, sacou?

Como chute, nessa parte do código aqui,

ps = conn.prepareStatement(sql);

pelo menos eu não vi se vc criou a conexão.
Se você não tiver feito algo do tipo

conn.getConnection();

Pode ser aí que está dando o Null.

Abração cara, e boa sorte.


#12

Falaaa Anderson,
Tudo tranquilo?
q legal msm. =D

Eu criei uma conexão sim Anderson no construtor
da minha classe.

A linha onde está ocorrendo o
NullPointerException é nessa linha:

rs = stmt.executeQuery("SELECT LAST_INSERT_ID()");

Na realidade eu não sei muito bem como
usar o comando SQL SELECT LAST_INSERT_ID() direito
é a primeira vez que eu estou usando ele.

Mas valeu Anderson,
Obrigado pela ajuda.

Abração.


#13

Vc mesmo ja respondeu sua pergunta:

rs = stmt.executeQuery("SELECT LAST_INSERT_ID()");

seu Statement não esta sendo criado em nenhum lugar.

[]´s


#14

Ooopa. Ó eu denovo.

Que tal algo do tipo:

select LAST_INSERT_ID() from endereco

Eu testei num banco meu aqui, e deu certinho.

E quanto ao que o jgbt falou. Da mesma forma que achei que você não tinha instanciado sua conexão, eu não vi no código que você postou acima, nos ultimos posts, se você instanciou o Statement.

acho que você apagou isso sem querer do seu código,

conn = this.conn;  
 ps = conn.prepareStatement(sql);

pois no código do início do post vc instanciou, e no código q postou por último, não tava instanciado. :smiley:

OUTRO EDIT: No lugar do stmt, não seria ps ?

int autoIncKeyFromFunc = -1;  
rs = stmt.executeQuery("SELECT LAST_INSERT_ID()");

Se continuar o erro, posta aqui a saida do stackTrace.

Falou!!!


#15

Velho você não esta tendo esse erro ?

[b]java.lang.UnsupportedOperationException  [/b]

pois se estiver, troca o seu driver pois ele esta bugado...


#16

Velho você não esta tendo esse erro ?

java.lang.UnsupportedOperationException

Da uma olha nesse link, eu não encontrei nada de errado ai...

http://java.sun.com/j2se/1.5.0/docs/api/java/sql/Statement.html#getGeneratedKeys()


#17

Obrigado mesmo a todo mundo que me ajudou
agora deu certo. Graças a Deus. =D.
Eu vou postar o meu código aqui pq se algum dia
alguém tiver a mesma dúvida que eu tive ele poderá ajudar. =D.

public int salvarEndereco(Endereco endereco) throws LAFQADaoException {
        PreparedStatement ps = null;        
        ResultSet rs = null;
        if (endereco == null)
            throw new LAFQADaoException("o valor passado não pode ser lido");
        try {
            String sql = "INSERT INTO endereco(rua, numero, bairro, " +
                    "cidade, estado, cep, uf)"
                    + "VALUES(?,?,?,?,?,?,?)";
            ps = conn.prepareStatement(sql);
            ps.setString(1, endereco.getRua());
            ps.setInt(2, endereco.getNumero());
            ps.setString(3, endereco.getBairro());
            ps.setString(4, endereco.getCidade());
            ps.setString(5, endereco.getEstado());
            ps.setString(6, endereco.getCep());
            ps.setString(7, endereco.getUf());              
            ps.executeUpdate();
            stmt = (Statement) conn.createStatement();
            int autoIncKeyFromFunc = -1;
            rs = stmt.executeQuery("SELECT LAST_INSERT_ID() FROM endereco");
            if (rs.next()) {
                autoIncKeyFromFunc = rs.getInt(1);
            }
            else {
                throw new LAFQADaoException("Erro ao pegar a chave primaria");
            }
            rs.close();
            System.out.println("Key returned from " +
                               "'SELECT LAST_INSERT_ID()': " +
                               autoIncKeyFromFunc);
            return autoIncKeyFromFunc;
        }
        catch (Exception sqle) {
            sqle.printStackTrace();
            throw new LAFQADaoException("Erro ao inserir dados" + sqle);
        }
        finally {
            try {
                ConnectionFactory.closeconnection(conn, ps);
            }
            catch (SQLException ex) {
                Logger.getLogger(ProdutorDao.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

Abraço a todos.


#18

ola pessoal, estou trabalhando com MYSQL
preciso INSERT INTO endereco pessoa e paciente, pegando o id da anterior
tentei usar o LAST INSERT_ID() mas não esta roalndo, alguem tem ideia sobre o assunto,

obs. quando o INSERT é uma só classe esta rolando...

abraços


#19