Dúvidas sobre relação de tabelas

8 respostas
Marcelo_Freitas1

Bom dia galera, a minha duvida é… quando temos relação entre tabelas, na chave estrangeira tem que trazer os dados da coluna da tabela referenciada, né ?
Tipo, em uma tabela “a” pega o dado da chave primaria da tabela “b”, ou não seria isso ?

8 Respostas

Lucas_Camara

Sim, o vínculo entre os registros num relacionamento de FK é feito usando o valor da coluna:

TB_PESSOA

+----+------+----------+
| id | nome | telefone |
+----+------+----------+
|  1 | 'A'  | 1        | <- Aqui vai o ID do telefone que está relacionado com a pessoa de ID 1
+----+------+----------+

TB_TELEFONE

+----+--------+
| id | numero |
+----+--------+
|  1 | 12345  |
+----+--------+
Marcelo_Freitas1

Então tem algo errado com a minha tabela por que os dados não passam automaticamente, eu teria que fazer o processo manualmente pelo jdbc…
Na coluna id tinha que vir o id do usuário e não vem, e esse id na tabela do usuário esta como chave primária…
Essa é a tabela de endereço…

CREATE TABLE public.endereco

(

rua character varying,

estado character varying NOT NULL,

cidade character varying,

pais character varying,

cep character varying NOT NULL,

numerocasa integer NOT NULL,

id_endereco bigint NOT NULL DEFAULT nextval(endesequence::regclass),

id bigint,

CONSTRAINT Endereco_pkey PRIMARY KEY (id_endereco),

CONSTRAINT enderecocomunicacao FOREIGN KEY (id)

REFERENCES public.usuario (id) MATCH SIMPLE

ON UPDATE NO ACTION ON DELETE NO ACTION

)
Marcelo_Freitas1

Na tabela de usuário esta assim …como podemos organizar e fazer funcionar ? Não esta tendo erro no console e o sistema funciona, mas eu teria que passar o id pelo jdbc em vez de ser automático feito pela relação de tabelas…
CONSTRAINT usuario_pkey PRIMARY KEY (id),
CONSTRAINT comunicacaoendereco FOREIGN KEY (id_endereco)
REFERENCES public.endereco (id_endereco) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,

Lucas_Camara

Vc está inserindo os dados através de uma aplicação? Se sim, como vc está fazendo?

Marcelo_Freitas1

Sim, eu estou desenvolvendo um projeto e faço os input no banco de dados através do jdbc (daos).

Lucas_Camara

Logo após o insert da tabela relacionada, vc pega o ID gerado para poder utilizar na tabela onde está a FK:

Se for mysql (ou algum outro DB que possua estratégia de auto incremento), por exemplo:

String sql = "YOUR INSERT STATEMENT HERE";
 
PreparedStatement ps = conn.prepareStatement(sql,
        Statement.RETURN_GENERATED_KEYS);
 
ps.execute();
 
// aqui vc pega o ID do registro que foi inserido
ResultSet rs = ps.getGeneratedKeys();
int generatedKey = 0;
if (rs.next()) {
    generatedKey = rs.getInt(1);
}
 
System.out.println("Inserted record's ID: " + generatedKey);

FONTE: https://www.codejava.net/java-se/jdbc/get-id-of-inserted-record-in-database

Marcelo_Freitas1

Ah então só colocando diretamente pelo jdbc,blza então.

Obrigado

Lucas_Camara

Se fosse direto pelo banco, vc teria que seguir o mesmo procedimento. Grava primeiro a tabela relacionada e depois a tabela onde está a FK.

Criado 3 de setembro de 2020
Ultima resposta 3 de set. de 2020
Respostas 8
Participantes 2