Ir para conteúdo

Arquivado

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

Guilherme bmp

Pergunta simples, coisa de iniciante

Recommended Posts

Ola para todos.

 

Sou iniciante em mysql, e preciso de ajuda para entender uma coisa.

Como coloco foreign key numa tabela já criada, com primary key e outros valores?

vi um exemplo na internet:

 

ALTER TABLE ievolution add FOREIGN KEY (endereco) REFERENCES tabela_enderecos (id);

 

vejam se entendi certo:

vo alterar a tabela ievolution, na coluna que criei para ser chave estrangeira, que vai referenciar outra tabela no primary key especifico dessa otura tabela!

 

é isso??

 

Certo e como poderei usar essa chave estrangeira? como poderei ver os valores da referencia que eu fiz?

Se eu quiser por exemplo imprimir na tabela o nome da referencia q faz a chave estrangeira...

ou intao importar os dados da referencia para a tabela?

 

Muito obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá amigão!

 

Foreign Key é uma restrição para se impor o que chamamos de Integridade Rerencial, ou seja, somente poderá ser cadastrado na coluna da tabela filha que contém a FK, os valores contidos na coluna PK da tabela Pai. Um exemplo seria, você não pode cadastrar num tabela de automóveis, um automóvel de uma marca que não contém na tabela de marcas.

 

Algumas nuaces deve ser respeitadas para se criar uma chave estrangeira, foreign key ou FK:

 

  • O campo referenciado da tabela pai deverá ser indexado como PK (Primary key);
  • As duas tabelas devem ser controladas por engines que dão suporte a Integridade Referencial, tais como InnoDB ou Falcon;
  • As colunas envolvidas devem possuir o mesmo tipo de dados e serem UNSIGNED;
Caso a tabela filha possua dados e alguns destes não estejam presentes na coluna PK, um erro lhe será devolvido pelo SGBD pois a Integridade Referencial não poderá ser aplicada. Com um LEFT JOIN você poderá analisar quais dados no filho, não tem no pai...

 

Bom, seria essa sua dúvida?? http://forum.imasters.com.br/public/style_emoticons/default/blush.gif

 

Mais detalhes, leia isso: http://dev.mysql.com/doc/refman/5.0/en/inn...onstraints.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá amigão!

 

Foreign Key é uma restrição para se impor o que chamamos de Integridade Rerencial, ou seja, somente poderá ser cadastrado na coluna da tabela filha que contém a FK, os valores contidos na coluna PK da tabela Pai. Um exemplo seria, você não pode cadastrar num tabela de automóveis, um automóvel de uma marca que não contém na tabela de marcas.

 

Algumas nuaces deve ser respeitadas para se criar uma chave estrangeira, foreign key ou FK:

 

  • O campo referenciado da tabela pai deverá ser indexado como PK (Primary key);
  • As duas tabelas devem ser controladas por engines que dão suporte a Integridade Referencial, tais como InnoDB ou Falcon;
  • As colunas envolvidas devem possuir o mesmo tipo de dados e serem UNSIGNED;
Caso a tabela filha possua dados e alguns destes não estejam presentes na coluna PK, um erro lhe será devolvido pelo SGBD pois a Integridade Referencial não poderá ser aplicada. Com um LEFT JOIN você poderá analisar quais dados no filho, não tem no pai...

 

Bom, seria essa sua dúvida?? http://forum.imasters.com.br/public/style_emoticons/default/blush.gif

 

Mais detalhes, leia isso: http://dev.mysql.com/doc/refman/5.0/en/inn...onstraints.html

Sim é uma boa ajuda! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Apesar de isso já eu saber praticamente tudo e ter compreendido no manual em EN.

 

A minha maior dúvida é as opções:

 

O Key name, penso que é apenas um nome a dar à FK e não vai servir como ref. para nenhuma query.

 

Agora isto:

 

On Delete e On Update e as suas opções...

 

Não consegui entender bem o seu resultado..

 

Podes ajudar-me?

 

Gracias http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa,

 

Vamos lá...na criação de tabelas InnoDB por exemplo, que dão suporte à Integridade Referencial, temos estas situações, as quais você apresenta dúvidas, mas são situações bem triviais e bem fáceis de se entender. As FOREIGN KEYS ou mesmo, Chaves Estrangeiras, são atributos que impõem a tal Integridade Referencial que é uma restrição, que, ao ser criada diz para o SGBD que: "Não deixe que seja cadastrado na coluna FK da tabela FILHA, dados que não esteja primeiramente cadastrados na tabela PAI"...vamos ilustrar isso?

 

Crie uma tabela de CARROS e outra de CORES, como abaixo:

 

mysql> create table carro (
	-> carro_id int unsigned auto_increment primary key,
	-> cor_id int unsigned not null,
	-> modelo char(80) not null
	-> ) Engine=InnoDB;
Query OK, 0 rows affected (0.08 sec)

mysql> create table cor (
	-> cor_id int unsigned auto_increment primary key,
	-> cor char(40) not null
	-> ) Engine=InnoDB;
Query OK, 0 rows affected (0.02 sec)

Bom, criamos somente as tabelas e os campos em comum entre elas, mas vale ressaltar que, temos que cadastar algumas cores e depois cadastrar os carros. Para que não aconteça de alguém cadastrar um carro com uma cor que não exista na tabela de cores é que criaremos a chave estrangeira, ou FK.

 

mysql> alter table carro add foreign key (cor_id) references cor (cor_id);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
Vamos inserir uma cores:

 

mysql> insert into cor (cor) values ('vermelho'), ('branco'), ('azul'), ('preto');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

Nesse momento, nossa tabela de cores tem os 4 linhas, que são respectivamente, 1, 2, 3, 4... para finalizar, vamos cadastrar um carro com a cor 2 e outro com a cor 5...

 

mysql> insert into carro set cor_id =2, modelo ='Fusca';
Query OK, 1 row affected (0.00 sec)

mysql> insert into carro set cor_id =5, modelo ='Pálio';
ERROR 1452 (23000): Cannot add or update a child row: a foreign key 
								 constraint fails (`test/carro`, CONSTRAINT `carro_ibfk_1` FOREIGN KEY (`cor_id`) 
								 REFERENCES `cor` (`cor_id`))

Bom, até aí a coisa está bem lógica, o segundo insert falhou pois não há na tabela de cor, uma cor com cor_id =5.

 

As propriedades NO ACTION e CASCADE são as mais utilizadas, sendo que, se eu utilizar NO ACTION (que é o padrão caso não seja informado o ON UPDATE ... ON DELETE ... na criação de uma Foreign Key), ao tentar excluir da tabela de cor uma cor que está sendo utilizada por algum carro na tabela de carros, um erro lhe será enviado. Façamos um teste com a tentativa de excluir a cor com o cor_id =2:

 

mysql> delete from cor where cor_id =2;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key 
								constraint fails (`test/carro`, CONSTRAINT `carro_ibfk_1` FOREIGN KEY (`cor_id`) 
								REFERENCES `cor` (`cor_id`))

No caso de CASCADE, os registros seriam excluídos em cascata. Vamos atualizar nossa FOREIGN KEY e atribuindo a propriedade CASCADE e faremos o teste para excluir a cor e veremos que o carro também será excluído:

 

mysql> alter table carro drop foreign key carro_ibfk_1; -- excluindo a foreign key que criamos
Query OK, 1 row affected (0.25 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> alter table carro add foreign key (cor_id) references cor (cor_id) on delete cascade on update cascade; -- criando a nova foreign key
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> delete from cor where cor_id =2; -- excluindo a cor, o que excluirá também o carro
Query OK, 1 row affected (0.00 sec)

mysql> select * from carro, cor; -- selecionando as tabelas, como tínhamos 1 registro somente em cada tabela, ambos foram excluídos
Empty set (0.00 sec)

Espero ter ajudado!! Bom final de semana!! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa,

 

Vamos lá...na criação de tabelas InnoDB por exemplo, que dão suporte à Integridade Referencial, temos estas situações, as quais você apresenta dúvidas, mas são situações bem triviais e bem fáceis de se entender. As FOREIGN KEYS ou mesmo, Chaves Estrangeiras, são atributos que impõem a tal Integridade Referencial que é uma restrição, que, ao ser criada diz para o SGBD que: "Não deixe que seja cadastrado na coluna FK da tabela FILHA, dados que não esteja primeiramente cadastrados na tabela PAI"...vamos ilustrar isso?

 

Crie uma tabela de CARROS e outra de CORES, como abaixo:

 

mysql> create table carro (
	-> carro_id int unsigned auto_increment primary key,
	-> cor_id int unsigned not null,
	-> modelo char(80) not null
	-> ) Engine=InnoDB;
Query OK, 0 rows affected (0.08 sec)

mysql> create table cor (
	-> cor_id int unsigned auto_increment primary key,
	-> cor char(40) not null
	-> ) Engine=InnoDB;
Query OK, 0 rows affected (0.02 sec)

Bom, criamos somente as tabelas e os campos em comum entre elas, mas vale ressaltar que, temos que cadastar algumas cores e depois cadastrar os carros. Para que não aconteça de alguém cadastrar um carro com uma cor que não exista na tabela de cores é que criaremos a chave estrangeira, ou FK.

 

mysql> alter table carro add foreign key (cor_id) references cor (cor_id);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
Vamos inserir uma cores:

 

mysql> insert into cor (cor) values ('vermelho'), ('branco'), ('azul'), ('preto');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

Nesse momento, nossa tabela de cores tem os 4 linhas, que são respectivamente, 1, 2, 3, 4... para finalizar, vamos cadastrar um carro com a cor 2 e outro com a cor 5...

 

mysql> insert into carro set cor_id =2, modelo ='Fusca';
Query OK, 1 row affected (0.00 sec)

mysql> insert into carro set cor_id =5, modelo ='Pálio';
ERROR 1452 (23000): Cannot add or update a child row: a foreign key 
								 constraint fails (`test/carro`, CONSTRAINT `carro_ibfk_1` FOREIGN KEY (`cor_id`) 
								 REFERENCES `cor` (`cor_id`))

Bom, até aí a coisa está bem lógica, o segundo insert falhou pois não há na tabela de cor, uma cor com cor_id =5.

 

As propriedades NO ACTION e CASCADE são as mais utilizadas, sendo que, se eu utilizar NO ACTION (que é o padrão caso não seja informado o ON UPDATE ... ON DELETE ... na criação de uma Foreign Key), ao tentar excluir da tabela de cor uma cor que está sendo utilizada por algum carro na tabela de carros, um erro lhe será enviado. Façamos um teste com a tentativa de excluir a cor com o cor_id =2:

 

mysql> delete from cor where cor_id =2;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key 
								constraint fails (`test/carro`, CONSTRAINT `carro_ibfk_1` FOREIGN KEY (`cor_id`) 
								REFERENCES `cor` (`cor_id`))

No caso de CASCADE, os registros seriam excluídos em cascata. Vamos atualizar nossa FOREIGN KEY e atribuindo a propriedade CASCADE e faremos o teste para excluir a cor e veremos que o carro também será excluído:

 

mysql> alter table carro drop foreign key carro_ibfk_1; -- excluindo a foreign key que criamos
Query OK, 1 row affected (0.25 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> alter table carro add foreign key (cor_id) references cor (cor_id) on delete cascade on update cascade; -- criando a nova foreign key
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> delete from cor where cor_id =2; -- excluindo a cor, o que excluirá também o carro
Query OK, 1 row affected (0.00 sec)

mysql> select * from carro, cor; -- selecionando as tabelas, como tínhamos 1 registro somente em cada tabela, ambos foram excluídos
Empty set (0.00 sec)

Espero ter ajudado!! Bom final de semana!! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Hum--- :wacko:

 

Eu pelo que li, a conclusão imediata que tive foi essa! Por isso é que fiquei confuso!

 

Eu só comecei com isto das FK pq comecei a utilizar um programa onde isso é possível! :rolleyes:

Então eu pensei, diz-me se estou certo, que as FK eram algo semelhante às relações entre tabelas do MAccess! Certo?

 

Pq até agora nunca tinha utilizado innoDB! Simplesmente MyIsam... Eu não sou grande espada em DB's... Utilizo só para os sites... E normalmente nunca se utiliza grandes estruturas...

 

Mas já vi que o innoDB é mto fixe! Isso vai-me ajudar em mto... Já não é necessário tar a apagar os registos das tabelas relacionadas... Meto o cascade http://forum.imasters.com.br/public/style_emoticons/default/grin.gif definido!

 

Agora só mais uma dúvidinha <_<

 

Ainda existe, para além do no action e cascade, o set null e restrict... certo?

 

É pq eu acho que um destes é mto útil!! Então seguindo o teu exemplo, eu tenho a tabela de carros e a de cores... Mas quero apagar os carros, mas sem apagar a cor da tabela de cores http://forum.imasters.com.br/public/style_emoticons/default/closedeyes.gif

 

Útil não? De resto mto fixe... Foste mto prestável.

 

OBRIGADÃO POR TUDO!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Forte abraço camarada!!!

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Oi,

 

O objectivo do post era tu responderes-me novamente... eheh

 

Pq eu não fiquei a compreender o set null e o restrict!

 

Para fazer o exemplo que eu te disse, utilizo qual?

 

Quero apagar um registo da tabela pai, sem alterar nd na tabela filho! É possível certo?

 

É pq no manual tá isto: NO ACTION and RESTRICT are the same!! Neste caso fiquei todo baralhado!

 

Valeu amigo! Só mais esta ajudinha! É pq eu compreendo bem o inglÊs, mas não consigo compreender estes termos mais especificos!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Forte abraço camarada!!!

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Oi,

 

O objectivo do post era tu responderes-me novamente... eheh

 

Pq eu não fiquei a compreender o set null e o restrict!

 

Para fazer o exemplo que eu te disse, utilizo qual?

 

Quero apagar um registo da tabela pai, sem alterar nd na tabela filho! É possível certo?

 

É pq no manual tá isto: NO ACTION and RESTRICT are the same!! Neste caso fiquei todo baralhado!

 

Valeu amigo! Só mais esta ajudinha! É pq eu compreendo bem o inglÊs, mas não consigo compreender estes termos mais especificos!

 

Eu acho que já sei onde está minha dúvida! :blink:

 

Tive a ler com mais atenção e reparei no seguinte... Tu dizes: Se existir definido o On Update ... ou On Delete! Então eu posso criar uma FK sem esses parametros?? É pq na interface que eu estou a utilizar ele obriga-me a colocar uma das quatro opções(no action, set null, cascade, restrict) colocando a última por defeito!

 

Como faço então?

 

Já estou mais esclarecido... Mais esta dúvida e vou começar a treinar http://forum.imasters.com.br/public/style_emoticons/default/blush.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade, o set default e o set null são opções para serem utilizadas da mesma maneira, somente que, (utilizando o modelo criado nesta discussão) quando você exclui uma cor que está relacionada com um carro na tabela de carros, o SGDB notará a falta dessa cor, deixará que esta seja excluída e então, no caso de SET NULL, setará o campo como NULL. Um problemade utilizar SET NULL é que, se o campo for NOT NULL, pau!! Já o SET DEFAULT, mesma coisa, só com a particularidade que será colocado o valor DEFAULT da coluna (esta é definido quando da criação da tabela).

 

Entendeste meu caro amigo "portuga"?? http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Caso tenha mais alguma dúvida, continue o post!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade, o set default e o set null são opções para serem utilizadas da mesma maneira, somente que, (utilizando o modelo criado nesta discussão) quando você exclui uma cor que está relacionada com um carro na tabela de carros, o SGDB notará a falta dessa cor, deixará que esta seja excluída e então, no caso de SET NULL, setará o campo como NULL. Um problemade utilizar SET NULL é que, se o campo for NOT NULL, pau!! Já o SET DEFAULT, mesma coisa, só com a particularidade que será colocado o valor DEFAULT da coluna (esta é definido quando da criação da tabela).

 

Entendeste meu caro amigo "portuga"?? http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Caso tenha mais alguma dúvida, continue o post!!!

:rolleyes:

 

Penso que sim...

 

Deixa-me fazer uns testes assim que tiver mais tempo, para confirmar tudo e testar...

 

Valeu amigo

 

Abraço

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.