Atualizar a quantidade do produto já existente na venda [RESOLVIDO]

Ola pessoal! estou tendo problemas em inserir um produto já existente em uma venda pois eu tenho a tabela produto, venda e itens_produto_venda, queria somar a quantidade do produto já existente na tabela itens_produto_venda pois ocorre o seguinte erro " ERRO duplicar valor da chave viola a restrição de unicidade 'pk_venda_produto ’ Detalhe: Chave(id_venda, id_produto)=(86,8) já existe" como faria pra resolver essa situação? estou há dias tentando resolver isso Agradeço muito se alguém puder ajudar.
Segue o método estou utilizando MVC:

public void inserirItem(ModeloVenda mod) {

    buscarCodProd(mod.getProduto());
    conectaVenda.conexao();
    try {
        
        //Tentar atualizar a quantidade do Item do produto gerado
       
        if (conectaVenda.rs.next()) {
             conectaVenda.executaSQL("select v.*, it.* from venda v, itens_produto_venda it where v.id_venda = it.id_venda and v.id_venda ="+ codVenda);
            conectaVenda.rs.first();
            codVenda  = conectaVenda.rs.getInt("id_venda");
            qtdeItem  = conectaItem.rs.getInt("qtde_produto");
            result    = qtdeItem + mod.getQtdeItem();
            
            //codItem   = conectaVenda.rs.getInt("id_produto");
           
            PreparedStatement pst = conectaVenda.conn.prepareStatement("update itens_produto_venda set qtde_produto = ? "+
            "where id_venda = ? and id_produto = ?");
            
            pst.setInt(1, result);
            pst.setInt(2, codVenda);
            pst.setInt(3, codItem);
            pst.executeUpdate();
            JOptionPane.showMessageDialog(null, "produto atualizado!");
       
        } else {PreparedStatement pst = conectaVenda.conn.prepareStatement("insert into itens_produto_venda "+
                "(id_venda, id_produto, qtde_produto) values(?,?,?)", conectaVenda.stm.RETURN_GENERATED_KEYS);
            pst.setInt(1, mod.getCod());
            pst.setInt(2, codProduto);
            pst.setInt(3, mod.getQtdeItem());
            pst.executeUpdate();
            conectaVenda.rs  = pst.getGeneratedKeys();
            conectaVenda.rs.next();
            codVenda   = conectaVenda.rs.getInt("id_venda");
            codItem    = conectaVenda.rs.getInt("id_produto");

            //Dando baixa de estoque (diminuindo a quantidade em estoque do campo qtde da tabela produto)
            conectaVenda.executaSQL("select * from produto where nome = '"+ mod.getProduto() +"'");
            conectaVenda.rs.first();
            quant = conectaVenda.rs.getInt("qtde");
            result = quant - mod.getQtdeItem();
            pst = conectaVenda.conn.prepareStatement("update produto set qtde = ? where nome = ?");
            pst.setInt(1, result);
            pst.setString(2, mod.getProduto());
            pst.execute();
            JOptionPane.showMessageDialog(null, "produto inserido!");
            conectaVenda.desconecta();
        }
    } catch (SQLException ex) {
        conectaVenda.desconecta();
        JOptionPane.showMessageDialog(null, "Erro ao inserir produto!\n ERRO: "+ ex.getMessage());
    }

Olá, posta a linha deste seu código que gerou o erro, ou posta o stacktrace completo. Mas basicamente vc está tentando inserir algo que já existe, não brigue contra o erro, aceite ele e que existe erro de lógica no seu código. Vc deveria estar executando o update, mas provavelmente está indo pro insert. Já debugou?

Bom dia! O erro que da é de SQL “ERRO duplicar valor da chave viola a restrição de unicidade 'pk_venda_produto ’ Detalhe: Chave(id_venda, id_produto)=(86,8) já existe” na linha de código só ta caindo no ELSE que tem a SQL que inseri um novo produto e não esta caindo no IF que a linha de código e a SQL que atualiza a quantidade do produto. Eu postei o codigo no comentario anterior.

Recomendo que vc faça algumas alterações no seu programa para facilitar na busca dos erros:

Crie um método para buscar a venda:

ModeloVenda vendaNoBanco = buscarVenda(codVenda, mod.getProduto()); // ou mod.getCod();

No método retorna um ModeloVenda, se não existir poderá retornar null ou uma exceção:

if (vendaNoBanco == null) {
    // deverá inserir uma nova venda
    vendaNoBanco = mod;
} else {
    // atualiza a venda
    vendaNoBanco.addQtdeItem(mod.getQtdeItem());
}

e por último, inserir ou atualizar, use na query o REPLACE em vez do INSERT ou UPDATE, pois o REPLACE irá atualizar se existir ou inserir se não existir:

atualizarVenda(vendaNoBanco);

Não esqueça de finalizar as conexões com o banco em cada método.

https://dev.mysql.com/doc/refman/5.7/en/replace.html

Ola! Consegui resolver o problema em atualizar a quantidade tentei a fazer dessa forma: if (mod = null) insere uma nova quantidade se for != null atualiza mas deste jeito só consigo atualizar um registro na venda ao tentar inserir outro item na venda ocorre um erro de resultSet isso ocorre porque o mod vai ser sempre != null por já existir a venda e não == null então fiz um outro botão no form somente para atualizar, dessa forma esta funcionando bem mas a ideia principal era inserir e atualizar no mesmo botão se alguém souber como resolver essa situação em inserir e atualizar no mesmo botão eu agradeço. Obrigado por ajudarem!:slight_smile:
segue o código do método atualizar:

public void atualizaVenda(ModeloVenda mod) {

    buscarCodVenda(mod.getCod());
    buscarCodProd(mod.getProduto());
    conectaVenda.conexao();
    
    try {

        conectaVenda.executaSQL("select * from itens_produto_venda where id_venda = "+ codVenda +" and id_produto = "+ codProduto);
        conectaVenda.rs.first();
        qtdeItem = conectaVenda.rs.getInt("qtde_produto") + mod.getQtdeItem();
        //JOptionPane.showMessageDialog(null, "Produto!\n "+ qtdeItem +" "+mod.getCod()+" "+ codProduto);
        
        PreparedStatement pst = conectaVenda.conn.prepareStatement("update itens_produto_venda set qtde_produto = ? "+
                "where id_produto = ? and id_venda = ?");
        pst.setInt(1, qtdeItem);
        pst.setInt(2, codProduto);
        pst.setInt(3, mod.getCod());
        pst.execute();

        //Dando baixa de estoque depois que atualizou (diminuindo a quantidade em estoque do campo qtde da tabela produto)
        conectaVenda.executaSQL("select * from produto where nome = '"+ mod.getProduto() +"'");
        conectaVenda.rs.first();
        quant = conectaVenda.rs.getInt("qtde");
        result = quant - mod.getQtdeItem();
        pst = conectaVenda.conn.prepareStatement("update produto set qtde = ? where nome = ?");
        pst.setInt(1, result);
        pst.setString(2, mod.getProduto());
        pst.execute();
        JOptionPane.showMessageDialog(null, "Produto atualizado!");
        conectaVenda.desconecta();
    } catch (SQLException ex) {
        conectaVenda.desconecta();
        JOptionPane.showMessageDialog(null, "Erro ao atualizar produto!\n ERRO: "+ ex.getMessage());
    }
     
}