Inserindo dados em duas Tabelas

Bom dia a todos,
gostaria de pedir se alguém pode esclarecer uma duvida, quando eu tento inserir dados em duas tabelas, sendo uma especialização, ou seja, recebe a PK da outra tabela, gera o seguinte erro em SQL:
[color=red]
12:13:44 INSERT INTO pessoa (RG_pessoa, CPF_pessoa, senha, orgao_emissor, nome_pessoa, entrada_col, saida_col, data_nascimento, sexo_pessoa, estado, CEP, cidade, logradouro, bairro, numero) VALUES (‘145’,‘141’,‘1231’, ‘SSPPR’, ‘Gustavo’, ‘14/05/12’, ‘14/05/03’, ‘14/05/03’, ‘m’, ‘PR’, 86360, ‘gdsa’, ‘asda’, ‘asdad’, 1081) 1 row(s) affected

12:13:44 INSERT INTO professor (curriculo, disc_leciona) VALUES (‘Informatica’,‘11-12-14-’) Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (boletim_virtual.professor, CONSTRAINT fk_Professor_Pessoa FOREIGN KEY (Pessoa_id_pessoa) REFERENCES pessoa (id_pessoa) ON DELETE NO ACTION ON UPDATE NO ACTION)

[/color]
Esse é o código para o teste que eu utilizei:
[color=blue]
INSERT INTO pessoa (RG_pessoa, CPF_pessoa, senha, orgao_emissor, nome_pessoa, entrada_col,
saida_col, data_nascimento, sexo_pessoa, estado, CEP, cidade, logradouro, bairro, numero)
VALUES (‘145’,‘141’,‘1231’, ‘SSPPR’, ‘Gustavo’, ‘14/05/12’, ‘14/05/03’, ‘14/05/03’, ‘m’, ‘PR’, 123456, ‘Cidade’, ‘Nome da rua’, ‘Nome do bairro’, 123);

INSERT INTO professor (curriculo, disc_leciona) VALUES (‘Informatica’,‘11-12-14-’);
[/color]
Tabelas no banco:

[color=brown]-- -----------------------------------------------------
– Table boletim_virtual.Pessoa
– -----------------------------------------------------[/color]
CREATE TABLE IF NOT EXISTS boletim_virtual.Pessoa (
id_pessoa INT NOT NULL AUTO_INCREMENT ,
RG_pessoa VARCHAR(9) NULL ,
CPF_pessoa VARCHAR(11) NULL ,
senha VARCHAR(20) NULL ,
orgao_emissor VARCHAR(7) NULL ,
nome_pessoa VARCHAR(70) NULL ,
entrada_col VARCHAR(10) NULL ,
saida_col VARCHAR(10) NULL ,
data_nascimento VARCHAR(10) NULL ,
sexo_pessoa CHAR NULL ,
estado VARCHAR(2) NULL ,
CEP INT NULL ,
cidade VARCHAR(50) NULL ,
logradouro VARCHAR(70) NULL ,
bairro VARCHAR(60) NULL ,
numero VARCHAR(5) NULL ,
PRIMARY KEY (id_pessoa) )
ENGINE = InnoDB;

[color=brown]-- -----------------------------------------------------
– Table boletim_virtual.Professor
– -----------------------------------------------------[/color]
CREATE TABLE IF NOT EXISTS boletim_virtual.Professor (
Pessoa_id_pessoa INT NOT NULL ,
curriculo TEXT NULL ,
disc_leciona VARCHAR(9) NULL ,
PRIMARY KEY (Pessoa_id_pessoa) ,
INDEX fk_Professor_Pessoa (Pessoa_id_pessoa ASC) ,
CONSTRAINT fk_Professor_Pessoa
FOREIGN KEY (Pessoa_id_pessoa )
REFERENCES boletim_virtual.Pessoa (id_pessoa )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

Agradeço a ajuda,

Att. Gustavo Fontolan

Por favor, ao postar tópicos, evite destacar o óbvio no título, como [Ajuda], [Duvida], [Urgente], [Socorro].

Deixe as marcações para indicar a tecnologia usada, ou se o tópico está ou não resolvido.

Faltou inserir o id_pessoa na tabela professor. Como ele não é AUTO_INCREMENT, você deve inseri-lo com o id da última pessoa cadastrada.
Aliás, isso é uma relação de 1-1. Normalmente, isso é um erro de normalização. Relações 1-1 podem ser transformadas em uma tabela só.

Se você está rodando consultas na mão, via JDBC, uma boa alternativa seria criar uma STORED_PROCEDURE no banco para fazer a inserção, e remover esses detalhes do código fonte.

Boa noite ViniGodoy,
então, o esquema da tabela é o seguinte, o professor e outra tabela chamada aluno, é uma especialização de pessoa, por eu ser novo em basicamente tudo, não sei dizer se o relacionamento esta certo, e estou procurando alguém que conheça mais que eu em banco de dados para auxiliar no meu banco, e dar algumas dicas e ideias para ser melhoradas ou removidas. Obrigado pela resposta, coloquei a tabela professor 1:1 com pessoa, não entendi a parte de juntar os dados da tabela, mesmo assim obrigado.

Att. Gustavo Fontolan

Mas conseguiu fazer a inserção? Basicamente, você deve pegar o id_pessoa que foi cadastrado na tabela pessoa, e usa-lo no insert da tabela professor.

Bom dia ViniGodoy,
Segui seu conselho, transformei o relacionamento em 1:1,
e coloquei AUTO_INCREMENT no Pessoa_id_pessoa, na tabela professor, só que eu tenho uma duvida, quando eu fizer essa inserção de dados, pode acontecer algum tipo de erro? Pois não quero perde a vinculação Pessoa-Professor.
Me explica mais um pouco sobre isso.

Obrigado.

Você não deveria colocar AUTO_INCREMENT nas tabelas em que tem relação de 1-1.

E sim, usar o mesmo ID usado na tabela pessoa.

Certo, você teria um código em SQL para representar isso?
Onde ele pega o id_pessoa após sua inserção e dentro da minha aplicação vou armazenar e após isso, utilizar na inserção dos dados na tabela professor. Uma outra coisa que fiquei em duvida, até onde eu sei que se gera uma tabela, seria com relacionamentos N:N certo? Não entendi a parte de armazenar tudo em uma tabela só.

Obrigado.

Você vai fazer JDBC no braço?
Uma possibilidade é usar o Hibernate e deixar que ele faça o mapeamento para você.

Se for fazer no braço, não tem muita escolha:
a) Faça o INSERT na tabela pessoa;
b) Use o método getGeneratedKeys para pegar a chave que foi inserida;
c) Faça o INSERT na tabela professor, usando essa chave.

Você não vai resolver isso com uma única linha de uma query, a menos que seu banco de dados te forneça uma variável como @LAST_INSERT_ID do SQL Server.

Então ViniGodoy,
estou desenvolvendo uma aplicação em JAVA, meus conhecimentos ainda não me permite utilizar Hibernate, estou utilizando JDBC com MYSQL. Se tiver algum código para mostrar a utilização do mesmo, ficarei muito agradecido.

Olá xcod, bom dia!

Cara, dá uma olhada na apostila FJ21 da Caelum…ela poderá te ajudar, em parte da sua dúvida (caso ainda não tenha resolvido).

abraço!