Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Guilherme bmp

Me expliquem as foreign keys!

Recommended Posts

Olá!

 

Eu mecho a algum tempo com mysql e até hj nao entendi o funcionamento de foreign keys..

eu sei para que serve obvio, para referenciar o 'ID' de outra tabela.. mas como faco isso??

 

Alguem consegue me explicar como atribuo uma foreign key, como crio uma coluna de FK, e como eu depois qnd for chamar no select os dados de uma tabela, como imprimir os dados do que eu estou referenciando numa tal FK??

 

E mais, tem como atribuir mais de uma FK para uma mesma linha de uma tabela?

 

Se alguem puder ajudar, sou grato!

Compartilhar este post


Link para o post
Compartilhar em outros sites

FK são chaves provenientes de outras tabelas, referenciando-as.

Para cria-las, ou você deve criar um atributo na tabela que receba o valor da outra tabela. Eu costumo utilizar o programa DBDesingner, onde na criação das tabelas, você faz o relacionamento entre as mesmas, criando automaticamente as FK's.

 

Um exemplo de uso:

 

Tenho 3 tabelas: requisicao, item_requisicao e material

A estrutura da tabela requisicao é

cod_requisicao - pk,

dt_requicao,

cod_setor, etc.

 

A esturura da material:

cod_material pk

ds_material , etc.

 

Já na item_requisicao:

cod_sequencia pk,

cod_requisicao fk

cod_material fk

qt_material

etc.

 

A última tabela relacionei com as duas primeiras. Os atributos que coloquei um fk na frente são os que estão referenciando e os pk, as chaves primarias.

 

Então em uma tabela posso ter n fk, dependendo da quantidade de tabelas que terei que referencia-la.

Para inserir valor nelas, faço isso no insert, colocando o valor da tabela pai como referencia.

 

Isso é um resumão bem sintetico, mas acho que já dá pra ter uma base.

 

Tenta criar essas tabelas e fazer o teste. E baixa também o programa que te falei, junto com o SQL YOG, pra te facilitar.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

A última tabela relacionei com as duas primeiras. Os atributos que coloquei um fk na frente são os que estão referenciando e os pk, as chaves primarias.

 

Então em uma tabela posso ter n fk, dependendo da quantidade de tabelas que terei que referencia-la.

Para inserir valor nelas, faço isso no insert, colocando o valor da tabela pai como referencia.

 

Isso é um resumão bem sintetico, mas acho que já dá pra ter uma base.

 

Tenta criar essas tabelas e fazer o teste. E baixa também o programa que te falei, junto com o SQL YOG, pra te facilitar.

 

Abraços

Xara, vlw pela reposta. Mas ainda não esclareceu minhas duvidas...

veja bem, quero saber como vou usar essa FK, depois em meu codigo php entende.. por exemplo, no seu exemplo se você estiver dando um select na tabela item_requisicao.. e quiser saber o nome do material que cod_material fk está refereciando... como você faria??

 

Pq se isso não for uma coisa facilitada para se fazer... não há sentido eu setar uma coluna como FK... é só por como int mesmo, e saber que esta refereciando alguma tabela..

 

e outra coisa.. se você quisse na sua tabela item_requisicao, atribuir dois materiais para um item;... tem como?

ou eu teria que criar duas linhas iguais com FK diferente?

 

vlww

Compartilhar este post


Link para o post
Compartilhar em outros sites

A última tabela relacionei com as duas primeiras. Os atributos que coloquei um fk na frente são os que estão referenciando e os pk, as chaves primarias.

 

Então em uma tabela posso ter n fk, dependendo da quantidade de tabelas que terei que referencia-la.

Para inserir valor nelas, faço isso no insert, colocando o valor da tabela pai como referencia.

 

Isso é um resumão bem sintetico, mas acho que já dá pra ter uma base.

 

Tenta criar essas tabelas e fazer o teste. E baixa também o programa que te falei, junto com o SQL YOG, pra te facilitar.

 

Abraços

Xara, vlw pela reposta. Mas ainda não esclareceu minhas duvidas...

veja bem, quero saber como vou usar essa FK, depois em meu codigo php entende.. por exemplo, no seu exemplo se você estiver dando um select na tabela item_requisicao.. e quiser saber o nome do material que cod_material fk está refereciando... como você faria??

 

Pq se isso não for uma coisa facilitada para se fazer... não há sentido eu setar uma coluna como FK... é só por como int mesmo, e saber que esta refereciando alguma tabela..

 

e outra coisa.. se você quisse na sua tabela item_requisicao, atribuir dois materiais para um item;... tem como?

ou eu teria que criar duas linhas iguais com FK diferente?

 

vlww

 

 

faz assim no select:

 

select a.cod_requisicao,b.desc_material, a.qt_material

from item_requisicao a, material b

where a.cod_material = b.cod_material

 

Faz o Join das duas tabelas com a FK da tabela item_requisicao.

 

O grande lance das FK é a segurança que você tem. Imagina se eu excluir do banco um material que está na tabela item_requisicao, perco a referetencia, correto? Com fk, quando for excluir, ele te dará uma mensagem de erro, pois há registros dependentes destes em outra tabela.

 

Do modo que coloquei na tabela item requisicao, você pode atribuir quanto materiais quiser, pois a PK é uma sequence. Mas coloquei um atributo qt_material, onde você informa a quantidade de material para esta requisição. Ficaria assim:

 

nr_sequencia-------nr_requisicao-------cod_material-------qt_material

1--------------------------1--------------------150-------------------2

2--------------------------1--------------------520-------------------5

3--------------------------1---------------------20-------------------6

 

Percebeu? A requisição de cod 1 contem 3 materiais cadastrados, onde na qt_material informei a quantidade.

 

Certo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

faz assim no select:

 

select a.cod_requisicao,b.desc_material, a.qt_material

from item_requisicao a, material b

where a.cod_material = b.cod_material

 

Faz o Join das duas tabelas com a FK da tabela item_requisicao.

 

O grande lance das FK é a segurança que você tem. Imagina se eu excluir do banco um material que está na tabela item_requisicao, perco a referetencia, correto? Com fk, quando for excluir, ele te dará uma mensagem de erro, pois há registros dependentes destes em outra tabela.

 

Do modo que coloquei na tabela item requisicao, você pode atribuir quanto materiais quiser, pois a PK é uma sequence. Mas coloquei um atributo qt_material, onde você informa a quantidade de material para esta requisição. Ficaria assim:

 

nr_sequencia-------nr_requisicao-------cod_material-------qt_material

1--------------------------1--------------------150-------------------2

2--------------------------1--------------------520-------------------5

3--------------------------1---------------------20-------------------6

 

Percebeu? A requisição de cod 1 contem 3 materiais cadastrados, onde na qt_material informei a quantidade.

 

Certo?

Ok.. então eu teria que criar uma tabela só para fazer as relações né?

pq o que eu queria é tipo assim ó:

 

nr_requisicao------------cod_material------------qt_material

-----1--------------------150, 152, 160-------------------2

-----2--------------------520, 45--------------------------5

 

mas agora estou vendo que não tem jeito nao

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim.

Cada row deve conter um material. Use uma sequence para esta tabela, para não ter problemas com chaves iguais.

 

Do modelo que fiz é o que recomendo.

 

Recomendo também para você manipular FK, o uso do software SQL YOG, nele você crias as chaves extrangeiras com facilidade.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eh o seguinte....

 

 

a mto mto mto tempo atras tinha um desenvolvedor mto mto mto imbecil q fazia mtas mtas mtas besteira e cagava o banco todo gerando mtas mtas mtas inconsitencias, entao um DBA mto mto mto preguiçoso encheu mto mto mto o saco dos caras que criaram o banco dizendo q eles deveriam fazer algo q soh permitisse q um campo fosse preenchido com valores pre-existentes em outra lista, entao depois de mto mto mto tentar e insistir na demissao o desenvolvedor topera cagador de banco, o crador do banco acabou criando uma constraint a qual chamou de foreing key, entao ele disse q o banco era mto mto mto melhor por causa disso pois dava mto mto mto mais integridade as tabelas e passou a cobrar mto mto mto mais caro pelo software do banco

 

:P

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.