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

Java

04/02/2016

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

Curtidas 0

Melhor post

Henrique Andrade

Henrique Andrade

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.
GOSTEI 1

Mais Respostas

Bruno Silva

Bruno Silva

04/02/2016

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.
GOSTEI 0
Henrique Andrade

Henrique Andrade

04/02/2016

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
GOSTEI 0
Edson Venancio

Edson Venancio

04/02/2016

Quando voce seta o combobox voce deve coloca +1 pois ele pega começa no zero..

Por exemplo tenho uma tela de cadastro que tem um combo que deixei padrao, com os estado os osuario so selecio e pronto conforme selecionado ja vai pra o banco ao invez de digita ..Porem quando cetei na aplicação cetei assim..

 	ufDTO.setIdUF(comboUf.getSelectedIndex() + 1);


//combouf e o nome do combobox.
GOSTEI 1
Bruno Silva

Bruno Silva

04/02/2016

Valeu Galera,

Gostaria de agradecer a ajuda de todos. Um grande abraço e bom carnaval para todos!!!!
GOSTEI 0
Edson Venancio

Edson Venancio

04/02/2016

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..
GOSTEI 0
POSTAR