RESOLVIDO Como fazer o insert com chave estrangeira

Bom dia, gostaria de saber como possso esta fazendo um um insert contendo a chave estrangeira vou exemplificar

tenho 2 tabela com generalizacao/ especializagao pessoa e funcionario como fazer para quando inserir uma pessoa passar o id para funcionario??

insert into pessoa (…)
insert into funcionatio (idPessoa,…)

tipo assim o insert acontece nas duas tabelas simultaneamente.

[quote=TASF]Bom dia, gostaria de saber como possso esta fazendo um um insert contendo a chave estrangeira vou exemplificar

tenho 2 tabela com generalizacao/ especializagao pessoa e funcionario como fazer para quando inserir uma pessoa passar o id para funcionario??

insert into pessoa (…)
insert into funcionatio (idPessoa,…)

tipo assim o insert acontece nas duas tabelas simultaneamente.

[/quote]

Simultaneamente não tem como, o máximo que você pode fazer é colocá-los na mesma transação. Os mecanismos de geração automática de chave primária não são padronizados, assim como também não são padronizados os mecanismos para obtenção da chave que acabou de ser gerada. Com JDBC você pode obter essas chaves com o método:

PreparedStatement st = connection.prepareStatement("insert into ..." , Statement.RETURN_GENERATED_KEYS)
st.executeUpdate();
st.getGeneratedKeys()

sem JDBC provavelmente você precisará recorrer às linguagens procedurais de cada banco.

eae brother fiz conforme sugerido, porem olha o resultado

com.mysql.jdbc.JDBC4ResultSet@3ed8e582 parece ser tipo um end.Memoria

como converto isso para o numero da chave ??

flw…

[quote=TASF]eae brother fiz conforme sugerido, porem olha o resultado

com.mysql.jdbc.JDBC4ResultSet@3ed8e582 parece ser tipo um end.Memoria

como converto isso para o numero da chave ??

flw…[/quote]

ResultSet pkRset = st.getGeneratedKeys();

int key = st.getInt(0);

ou algo parecido com isso rsrsrsrs

Fala ae galera consegui resolver essa questão de uma forma + simples do que usar Statement.RETURN_GENERATED_KEYS

ate pq dessa forma eu nao soube o que fazer com o retorno que parece um endereco de memoria .

entao vo postar a solução pra quem se encontrar no mesmo dilema que eu

basicamente é usado LAST_INSERT_ID() para faser o insert simultaneamente, pois é esse “metodo” que irá retornar o valor do campo id que foi encrementado antes da query em que o cita.

segue os 2 insert’s pra facilitar o entendimento

	 String sqlUSER=("INSERT INTO gcp020_pessoa (gcp020_nome,gcp020_email,gcp020_telefone_01,gcp020_telefone_02,gcp020_endereco,gcp020_bairro,gcp020_cidade,gcp020_sexo,gcp020_tipo_perfil) VALUES(?,?,?,?,?,?,?,?,?)");
	 String sqlCOLABORADOR=("INSERT INTO gcp03_colaborador (gcp03_login,gcp03_senha,gcp03_dt_admissao,gcp03_realiza_vendas,gcp020_pessoa_gcp020_idgcp020_pessoa) VALUES(?,?,?,?,LAST_INSERT_ID())");//last_insert... retorna o ultimo id que foi incrementado antes da querry que o cita ou seja  retorna ultimo id incrementado da tabela pessoa
 

E no PreparedStatement do insert que contem a FK fica assim

                stmtColaborador.setString(1,cb.getLogin());
		stmtColaborador.setString(2,cb.getSenha());
		stmtColaborador.setString(3, cb.getDtAdmissao());
		stmtColaborador.setString(4, cb.getRealizaVendas());
		stmtColaborador.execute();
		//o detalhe é que eu passei apenas os 4 paramentros ?,?,?,? e o quinto que é a FK fica por conta do  LAST_INSERT_ID() como ja dito faz o trabalho de inserir  a PK de um como FK na outra

Obrigado aê pelas dicas.mas achei uma maneira mas simples. até a proxima…

[quote=TASF]Fala ae galera consegui resolver essa questão de uma forma + simples do que usar Statement.RETURN_GENERATED_KEYS

ate pq dessa forma eu nao soube o que fazer com o retorno que parece um endereco de memoria .

entao vo postar a solução pra quem se encontrar no mesmo dilema que eu

basicamente é usado LAST_INSERT_ID() para faser o insert simultaneamente, pois é esse “metodo” que irá retornar o valor do campo id que foi encrementado antes da query em que o cita.

segue os 2 insert’s pra facilitar o entendimento

	 String sqlUSER=("INSERT INTO gcp020_pessoa (gcp020_nome,gcp020_email,gcp020_telefone_01,gcp020_telefone_02,gcp020_endereco,gcp020_bairro,gcp020_cidade,gcp020_sexo,gcp020_tipo_perfil) VALUES(?,?,?,?,?,?,?,?,?)");
	 String sqlCOLABORADOR=("INSERT INTO gcp03_colaborador (gcp03_login,gcp03_senha,gcp03_dt_admissao,gcp03_realiza_vendas,gcp020_pessoa_gcp020_idgcp020_pessoa) VALUES(?,?,?,?,LAST_INSERT_ID())");//last_insert... retorna o ultimo id que foi incrementado antes da querry que o cita ou seja  retorna ultimo id incrementado da tabela pessoa
 

E no PreparedStatement do insert que contem a FK fica assim

                stmtColaborador.setString(1,cb.getLogin());
		stmtColaborador.setString(2,cb.getSenha());
		stmtColaborador.setString(3, cb.getDtAdmissao());
		stmtColaborador.setString(4, cb.getRealizaVendas());
		stmtColaborador.execute();
		//o detalhe é que eu passei apenas os 4 paramentros ?,?,?,? e o quinto que é a FK fica por conta do  LAST_INSERT_ID() como ja dito faz o trabalho de inserir  a PK de um como FK na outra

Obrigado aê pelas dicas.mas achei uma maneira mas simples. até a proxima…[/quote]

Correto também, mas vale lembrar que essa solução só funciona no SGBD que você está usando (qual seria ? MySQL, Oracle , SQL Server ?). Essa função LAST_INSERT_ID(), até onde eu me lembro não é padronizada pelo ANSI SQL.

Sim concordo, no meu caso estou usando o Mysql, funfa redondo, ja para outros sgbds não sei se ira funcionar.