Erro do tipo Mysql Integrity Constraint Violation na hora de salvar dados no banco

04/02/2016

0

Bom dia Galera,

Estou desenvolvendo uma pequena aplicação desktop através do NetBeans utilizando o Swing, porem estou enfrentando um problema na hora de gravar os dados no banco Mysql. O problema ocorre quando eu clico no botão "salvar" é exibida a seguinte mensagem:

`
com.mysql.jdbc.exceptions:4,MysqlIntegrityConstraintViolation: Cannot add or update a child row: a foreign key constraint fails ('ControleFinanceiro'.'conta',CONSTRAINT 'subcategoriaId_FK' FOREIGN KEY ('subcategoriaId') REFERENCES 'subcategria' ('id'))
`

Segue abaixo o código da minha DAO a qual salva no banco de dados:

`

public void Salvar(Conta c) {

String sql = "insert into conta (tipoconta, pessoaId, categoriaId, subcategoriaId, valor, dataVencimento, statusConta) VALUES (?,?,?,?,?,?,?)";

try (PreparedStatement stmt = connection.prepareStatement(sql)){
stmt.setString(1,c.getTipoConta().getDescricao());
stmt.setInt(2,c.getPessoaId());
stmt.setInt(3,c.getCategoriaId());
stmt.setInt(4,c.getsubCategoriaId());
stmt.setDouble(5,c.getValor());
java.sql.Date dtVencimento = java.sql.Date.valueOf(c.getDataVencimento());
stmt.setDate(6,dtVencimento);
stmt.setString(7, c.getStatusConta().getDescricao());
stmt.execute();
stmt.close();
JOptionPane.showMessageDialog(null,"Cadastro de conta realizado com sucesso");
connection.close();
}
catch(SQLException ex) {
JOptionPane.showMessageDialog(null,"Não foi possível cadastrar a conta no banco de dados\n" + ex);
}
}
`

Essas são as minhas tabelas criadas no banco MYSQL Workbench:

`

CREATE TABLE Categoria
(id int NOT NULL auto_increment,
descricao VARCHAR(70) NOT NULL,
CONSTRAINT pk_categoriaId primary key(id));


CREATE TABLE Subcategoria
(id int NOT NULL auto_increment,
tipo VARCHAR(50) NOT NULL,
CONSTRAINT pk_subcategoriaId primary key(id));


CREATE TABLE Pessoa
(id int NOT NULL auto_increment,
nome VARCHAR(50) NOT NULL,
nomeBanco VARCHAR(50) NOT NULL,
saldo decimal(5) NOT NULL,
CONSTRAINT pk_pessoaId primary key(id));


CREATE TABLE Conta
(id smallint(50) NOT NULL auto_increment,
tipoconta enum ('Pagar','Receber'),
statusConta enum ('Pendente','Paga','Cancelada'),
pessoaId INT NOT NULL,
categoriaId INT NOT NULL,
subcategoriaId INT NOT NULL,
valor decimal(5),
dataVencimento date,
CONSTRAINT pk_contaId primary key(id),
CONSTRAINT fk_categoriaId FOREIGN KEY (categoriaId) REFERENCES categoria (id),
CONSTRAINT fk_subcategoriaId FOREIGN KEY (subcategoriaId) REFERENCES Subcategoria (id),
CONSTRAINT fk_pessoaId FOREIGN KEY (pessoaId) REFERENCES Pessoa (id));
`

Só para que vocês entendam melhor, o conteúdo das tabelas "Pessoa", "Categoria" e "Subcategoria" é exibido em um combobox contido no formulário de Cadastro de Conta, sendo assim o usuário deverá selecionar cada campo para cadastrar uma conta, o estranho é que esse erro só ocorre caso eu selecione o primeiro valor vindo de cada uma dessas tabelas, caso eu pegue o valor contido na segunda posição da tabela, o erro não ocorre, isso para qualquer uma das 3 tabelas (pessoa, categoria ou subcategoria).

Desde já agradeço os colegas por qualquer ajuda. Desculpe por não ter formatado o código, é porque houve algum problema na página que não estava habilitando a opção para inserir código no momento.
Bruno Silva

Bruno Silva

Responder

Post mais votado

04/02/2016

`
com.mysql.jdbc.exceptions:4,MysqlIntegrityConstraintViolation: Cannot add or update a child row: a foreign key constraint fails ('ControleFinanceiro'.'conta',CONSTRAINT 'subcategoriaId_FK' FOREIGN KEY ('subcategoriaId') REFERENCES 'subcategria' ('id'))
`


Ali no references, falta um "o" em 'subcategoria' ('id')), acredito que você copiou esse erro do log, então não deve ser erro de digitação aqui.

Henrique Andrade

Henrique Andrade
Responder

Mais Posts

06/02/2016

Bruno Silva

Na verdade o erro só ocorre quando eu escolho o primeiro objeto contido no combobox referente a classe "Pessoa", "Categoria", ou "Subcategoria". Caso eu selecione a segunda opção contida no combobox ele salva normalmente no banco.

Outro detalhe, no meu banco, eu já crio um insert com valores padrão para cada uma dessas tableas, por exemplo, a table Pessoa estou colocando o meu nome e as informações, na table Categoria estou colocando outros dados e na subcategoria também, para que o meu combobox já venha com algumas informações preenchidas por padrão.
Responder

07/02/2016

Henrique Andrade

Entendi, já aconteceu isso comigo, o erro era que o primeiro item do combobox era de valor = 0, já o segundo é de valor 1. Então se você estiver usando de valor selecionado por índice, vai dar problema, adicone um valor pra ser o item 0 da combobox. Por Exemplo:

Selecione... = índex 0
Seu nome = index 1
Responder

08/02/2016

Bruno Silva

Valeu Galera,

Gostaria de agradecer a ajuda de todos. Um grande abraço e bom carnaval para todos!!!!
Responder

08/02/2016

Edson Venancio

Como foi dito pro java a primeira posição e zero...
Se você seta a primeira opção ele vai cair na segunda pois no banco a primeira e 1, mas no combo e zero..
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar