Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
11
respostas

Field 'id' doesn't have a default value


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class InserirProdutos {

    public static void main(String[] args) throws SQLException {
        //faz conexao com banco
        Connection con
                = DriverManager.getConnection("jdbc:mysql://localhost/lojadb", "root", "root");

        Statement stm = con.createStatement();

        boolean resultado
                = stm.execute("insert into Produto"
                        + " (nome, descricao) values"
                        + " ('notebook','Notebook i5')", Statement.RETURN_GENERATED_KEYS);
        //retorna todos os ids gerados para cada produto inserido
        ResultSet resultSet = stm.getGeneratedKeys();

        while (resultSet.next()) {
            long id = resultSet.getLong("id");
            System.out.println(id + "gerado");
        }

        System.out.println("o resultado foi" + resultado);
        resultSet.close();
        stm.close();
        con.close();
    }

}

qual o problema?

11 respostas

Tente utilizar o SQL de inclusão da seguinte forma:

insert into Produto (id,nome, descricao) values(null,'notebook','Notebook i5')

Se o campo estiver configurado como AUTOINCREMENT no MYSQL, se não me engano, vai computar o INSERT com valor nulo para o id como um novo valor de auto incremento.

Não testei aqui, mas quando trabalhei com MYSQL fazia dessa forma.

não funcionou se eu coloque null, ele falar que o id não exite 'id not fund'

Sua tabela não possui esse campo? Deveria, não? Talvez seja esse o problema... Qual é a chave primária?

Claro que tenho moço, inclusive  ele consegue inerir
só não consegue é fazer a consulta utilizando o método abaixo
 ResultSet resultSet = stm.getGeneratedKeys();

        while (resultSet.next()) {
            long id = resultSet.getLong("id");
            System.out.println(id + "gerado");
        }

iiixx.. então sei não... verifica se o campo id é AUTO_INCREMENT...

situação estranha...

Posta a classe produto aqui pra gente ver

Posta a classe produto aqui pra gente ver, meu chute é a seguinte situação, você não está incrementando esse ID no seu banco, e também não está falando que id ta sendo no insert. Tenta

insert into Produto (id,nome, descricao) values(1'notebook','Notebook i5')

Mais não deixa de postar sua classe produto

@Alisson, cuidado... faltou uma vírgula no SQL sugerido ai

insert into Produto (id,nome, descricao) values(1,'notebook','Notebook i5')

@W.K ALMEIDA tenta inserir mais de um tb...

insert into Produto (id,nome, descricao) values(1,'notebook','Notebook i5');
insert into Produto (id,nome, descricao) values(2,'notebook 2','Notebook i7');
insert into Produto (id,nome, descricao) values(3,'notebook 3','Notebook i3');

não esquece da vírgula...

CREATE TABLE Produto (
id INTEGER  PRIMARY KEY AUTO_INCREMENT,
 nome VARCHAR(255),
 descricao VARCHAR(255)
);

COLOQUEI SÓ PRA POSTAR MESMO, mas vocês não entenderem a tabela é regada no banco eu consigo fazer insert mas só não consigo buscar os ids utilizando o banco MySql como propõe o exercício, a diferença é que no curso ele utiliza outro banco.

Agora vc explicou....

=D

Cara... estranho esse problema... verifique a versão do driver (certifique-se de usar uma versão recente... ou usar uma versão um pouco menos recente).

Outra coisa que faria é debugar esse objeto "resultSet". Qual o número de registros? O erro é disparado depois da linha em que o resultado é recuperado?

Enfirm... parte pro desespero... tenta saber tudo minunciosamente pq esse erro ta bem estranho. Eu sou ateu, mas nesse caso ai eu tentaria umas 3 ave maria e um pai nosso... quem sabe, né?

solução!

Cara faz um teste que acho que pode dar certo, no lugar no seu.

while (resultSet.next()) {
            long id = resultSet.getLong("id");
            System.out.println(id + "gerado");
        }

Faz.

while (resultSet.next()) {
            String id = resultSet.getLong("id");
            System.out.println(id + "gerado");
        }

Me da o retorno, abraço