Erro do tipo Mysql Integrity Constraint Violation na hora de salvar dados no banco
04/02/2016
0
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
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
Mais Posts
06/02/2016
Bruno Silva
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.
07/02/2016
Henrique Andrade
Selecione... = índex 0
Seu nome = index 1
08/02/2016
Bruno Silva
Gostaria de agradecer a ajuda de todos. Um grande abraço e bom carnaval para todos!!!!
08/02/2016
Edson Venancio
Se você seta a primeira opção ele vai cair na segunda pois no banco a primeira e 1, mas no combo e zero..
Clique aqui para fazer login e interagir na Comunidade :)