[RESOLVIDO] Dúvidas na inserção de registros em duas tabelas

Olá a todos. Tenho uma dúvida no seguinte. Tenho uma tabela de produtos e uma tabela de tamanhos referente a esses produtos. Na tabela de produtos eu tenho um ID que é auto incrementado. Mas precisava gerar os registros de tamanhos referentes a esse produto e usaria esse ID do produto como chave estrangeira. Eu gostaria de cadastrar o produto e gerar um novo ID e gerar o registro na tabela de tamanhos referentes a esse ID. Mas até a inserção na tabela de tamanhos eu ainda não tenho o número do ID gerado do produto. Alguém tem uma solução ou sugestão simples para fazer isso?

Olá Bruno, isso é simples de se fazer. está fazendo com java ? se sim a própria lib JDBC tem um método de recuperar o ID inserido numa tabela(você tem que passar um parâmetro para o statement) da uma pesquisada no google sobre isso que acha bem fácil, isso é o de menos.

No teu DAO(classe que você inseri na tabela produto) depois de inserir recupera o valor do ID e simplismente pega esse valor e insira na outra tabela com outro statement(outra query de insert).

Ficaria mais ou menos assim:

public void inserir(){
String queryProduto = "suaquery";
PreparedStatement ps = conn.prepareStatement(queryProduto, Statement.RETURN_GENERATED_KEYS);
Long id = null;
ps.executeUpdate();
ResultSet rs = ps.getGeneratedKeys();
if (rs.next()) {
    id = rs.getInt(1);
}
if(id != null){
 //insira na outra tabela
}

}

Mais ou menos isso dai.

Estou vendo agora que você marcou PHP, a lógica é a mesma, vai usar a lib do php(não sei qual é…kk)

Na verdade eu já estou tentando resolver da seguinte forma:

O problema que consigo gerar o sql dos tamanhos mas ele não insere na tabela. Insere somente o produto principal com o id certinho. Mas a do tamanho não insere.

Se eu copiar a sql que imprimo e executar direto no banco da certinho. Mas pelo php só gera o retorno de “Erro grade”.

if(insereProduto($conexao,$produto)){
$id = localizaIdProduto($conexao);
if(insereGradeProduto($conexao,$id,$_POST[“min”],$_POST[“max”])){
echo “Sucesso grade.”;
}else{
echo “Erro grade.”;
}
$_SESSION[“success”]=“Produto cadastrado com sucesso”;
}else{
$_SESSION[“danger”]=“Erro ao cadastrar produto”;
}
function localizaIdProduto($conexao){
$query = “SELECT MAX(id) id from PRODUTOS”;
$consulta = mysqli_query($conexao,$query);
$resultado = mysqli_fetch_assoc($consulta);
return $resultado[‘id’];
}
function insereGradeProduto($conexao,$id,$min,$max){
$query = “”;
for($i=$min;$i<=$max;$i++){
$query.=“INSERT INTO PRODUTOS_GRADE (id,tamanho) VALUES ({$id},{$i});”;
}
echo $query;
return mysqli_query($conexao, $query);
}

O PHP apresenta opções para tratamento de exceção e você não utiliza nenhuma, por que?
Mesmo que seja um die da vida, você já conseguiria ter uma mensagem mais assertiva sobre a causa do problema.
O ideal seria utilizar, para envolver o bloco de conexão e execução da query, um try/catch

Opa. Já encontrei a solução.
Mudei a sql pra ser uma só. Parece que que não executa várias querys de uma vez só. Desculpem a abrição de tópicos. Mas eu pergunto quando não consigo pensar mais, mas vou pelejando até dar certo. Obrigado a todos. Só pra constar a minha solução:

function insereGradeProduto($conexao,$id,$min,$max){
    $query="";
    $query.="INSERT INTO PRODUTOS_GRADE (id,tamanho) VALUES";
    for($i=$min;$i<$max;$i++){
        $query.="({$id},{$i}),";
    }
    $query.="({$id},{$i});";
    return mysqli_query($conexao,$query);
}

Quanto ao tratamento de exceções falta mesmo. Sou iniciante no PHP e preciso colocar isso mesmo. Mas desde já agradeço.