Dúvidas em MySQL e Java

Boa tarde,

Sei que este não é o local mais apropriado para a pergunta, visto que não se trata de uma dúvida em Java (ao menos não totalmente), mas ainda assim não obtive uma resposta que eu entendesse a respeito deste assunto. Minhas dúvidas são as seguintes:

-Tenho uma tabela pessoa como campos id (PK) e nome
-Tenho duas tabelas, funcionário e cliente, que são especializações de pessoa. Funcionário tem o campo localDeTrabalho e Cliente tem o campo localização. Tanto funcionário e cliente possuem como chave primária a chave estrangeira de pessoa.

Na minha aplicação, devo cadastrar funcionários e clientes. Como eu insiro (ou deleto) um funcionário F (ou um cliente C) tanto na tabela pessoa como na tabela funcionário (cliente) ? Ou seja, quando há uma especialização, como eu insiro e deleto as informações tanto da tabela pai qto da tabela filha de modo correto?
Esta dúvida é tanto em relação ao banco de dados qto aos comandos que devo executar na minha aplicação para que o resultado seja correto.
Não tenho muito conhecimento em SQL e banco de dados, por isso agradeço por qlq ajuda de vocês.

[]'s

Cara, não sei se entendi muito bem a sua dúvida, mas acredito que o que você tem de fazer é, na sua chave-estrangeira na tabela filha, definir o “On Delete” para “Cascade”. Dessa forma, caso o registro da tabela pai seja excluído, todos os registros da tabela filha que apontam para o registro excluído também serão excluídos.

Yky,

Consegui chegar a esta conclusão tb :slight_smile:
Mas minha dúvida quanto à inserção de dados permanece.
Como eu faço para que os dados da parte “pessoa” de um funcionário/cliente sejam inseridos corretamente na tabela pessoa?

se eu der somente INSERT INTO funcionario(…) ele soh vai inserir os campos do funcionario na tabela funcionario, mas preciso guardar seus dados de pessoa na tabela pessoa.

[]'s e obrigado

Mas cara, tu não deves replicar as informações nas duas tabelas. Já que as informações têm de estar na tabela Pessoa, e somente os campos especializados têm de estar na sua respectiva tabela, o que tu precisas fazer é inserir os dados na tabela Pessoa.

Então, na tabela Funcionario OU na tabela Cliente tu inseres SOMENTE a ID (PK) da tabela Pessoa.

cara eu te recomendo aprender o framework de persistência Hibernate.
Ele suporta herança, o mapeamento através de annotations é muito simples, não precisa escrever sql… enfim… a tua produtividade aumenta muito.

Mas como você disse que não sabe muito de sql e banco de dados, também é uma boa aprender sql e banco de dados, porque isso sempre é útil.
Abraços

Então…
Por exemplo, quero inserir o funcionario Zé que mora em São Paulo
Dou lá INSERT INTO pessoa(nome) VALUES(‘Zé’)
como eu vou saber a id da pessoa que representa o Zé??

SELECT ID FROM pessoa WHERE nome = '" + ParametroComoNomeInserido + "';"

Acho que no seu caso o melhor a se fazer é desepecializar pessoa e criar 2 tabelas: Funcionarios e Clientes.

infelizmente não posso fazer isso Yky, e também não teria pq, haveria muita redudância de dados.

/* Editando */
Para ilustrar o caso desenvolvi este código:

[code]CREATE TABLE produto (
codigo INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
nome VARCHAR(45) NOT NULL,
PRIMARY KEY(codigo)
)
TYPE=InnoDB;

CREATE TABLE cd (
produto_codigo INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
categoria VARCHAR(45) NULL ,
PRIMARY KEY(produto_codigo),
INDEX cd_FKIndex1(produto_codigo),
FOREIGN KEY(produto_codigo)
REFERENCES produto(codigo)
ON DELETE CASCADE
ON UPDATE NO ACTION
)
TYPE=InnoDB;
[/code]

Minha dúvida é: como faço para inserir o nome do cd em produto?

ps.: Conheço uma solução “gambiarra” que não sei se irá gerar efeitos colaterais. Eis ela:
INSERT INTO produto(nome) VALUES(‘Zé’)
SELECT @last = LAST_INSERT_ID(); //isso armazena a última id armazenada
INSERT INTO cd VALUES(@last,'Sertanejo ');

[]'s