Jump to content

Archived

This topic is now archived and is closed to further replies.

vitow

configurações do ON DELETE no Foreign Key

Recommended Posts

eu to criando um banco de dados no MySql utilizando o editor MySql-FRONT, eu criei as tabelas e configurei as chaves primárias e chaves estrangeiras, povoei o banco de dados.... até aew tudo bem!Quando fui deletar uma tabela pai sendo que ela possuia filhos, deletou-se a tabela pai mas os filhos não foram deletados...onde quero chegar.... eu quero que não autorize deletar a tabela pai enquanto tenha filhos.. entendeu???....na configurações do Foreign Key possui o on delete... essas opções que eu gostaria de saber e o que significa cada uma delas, para que eu possa configurar o meu banco sem essas vulnerabilidades... oui se tem outra forma de amarrá-lo melhor e mais seguro!!... OKajudem por favor!!!!obrigado..

Share this post


Link to post
Share on other sites

Olá amigão,

 

Integridade Referencial, é isso que você quer! Integridade Referencial é restringir que uma tabela filha só tenha o que a tabela pai tem, ou seja, só poderemos inserir na foreign key os dados cadastrados na coluna primary key.

 

Bom, primeira coisa que temos que checar é se você está usando tabelas InnoDB, pois com tabelas MyISAM não é possível garantir tal restrição pois elas não dão suporte a Integridade Referencial. No MySQL somente tabelas InnoDB, BDB e Falcon possuem este tipo de restrição.

 

Checando o egine utilizando nas tabelas do meu banco de dados:

 

SHOW TABLE STATUS;

 

Bom, caso sejam mesmo as suas tabelas MyISAM, use o seguinte comando para convertê-las:

 

ALTER TABLE <nome_tabela> ENGNIE =InnoDB;

 

...após este comando, sua tabela foi alterada e os arquivos ".MYI" e ".MYD" que estavam dentro do diretório do banco de dados são deletados, ficando somente um arquivo de extensão ".frm"...lembre-se que, VOCÊ NÃO MAIS PODERÁ FAZER BACKUPS DO SEU BANCO COPIANDO OS ARQUIVOS, POIS AGORA OS DADOS E ÍNDICES DE SUAS TABELAS ESTÃO EM UMA ESTRUTURA LÓGICA CHAMADA TABLESPACE. Para maiores informações sobre backup no mysql, leia este artigo:

 

=> Aprenda a fazer backup's de seu banco de dados no MySQL

 

Bom, enfim, as tabelas envolvidas na criação de uma foreign key devem ser do mesmo engine, ou seja, aqui nesse caso as tabelas envolvidas na restrição devem ser do tipo InnoDB e os capos devem armazenar os mesmo tipo de dados (de preferência que sejam do tipo INT ou INTEGER). Após efetuar estas verificações, garanta que a tabela filha não tenha nenhum dado que não faça parte do pai...caso possa fazer, emita o seguinte comando para limpar a tabela:

 

http://forum.imasters.com.br/public/style_emoticons/default/excl.gif SOMENTE EMITA ESSE COMANDO SE TIVER CERTEZA DO QUE ESTÁ FAZENDO, OS DADOS SERÃO APAGADOS JUNTAMENTE COM O SEQUECIAL AUTO_INCREMENT!

 

TRUNCATE TABLE <nome_tabela>;

 

...agora, emita o comando para criação da foreign key:

 

ALTER TABLE <nome_tabela> ADD CONSTRAINT FK_nome_fk
FOREIGN KEY (nome_campo_filho) REFERENCES <nome_tabela_pai>(nome_campo_pai)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

 

Qualquer dúvida, continue postando!! Abração!! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Share this post


Link to post
Share on other sites

man eu fiz tudinho.... valeu mesmo!!!mas ficou uma duvida, eu não gosto de fazer as coisas sem saber o que táh fazendo sacks, qual a ação daquele código!!... então, eu gostaria de saber qual a diferença de declararmos o ON DELETE CASCADE do ON DELETE NO ACTION... e se tiver outras declarações, poderia demonstrar??.... valeu mesmo =)abrigado!!!

Share this post


Link to post
Share on other sites

Vamos lá "mano", rs

 

ON DELETE NO ACTION = Exclui somente o pai sem afetar o(s) registro(s) filhos ou relacionados em outras entidades.

ON DELETE CASCADE = É o chamado cascateamento, excluindo o pai, exclui também todos os registros rrelacionados em outras tabelas. No caso de uma nota fiscal que tem muito itens, o id da nota fiscal está na tabela de itens da nota fiscal. Excluindo uma nota, você esxclui também toda a movimentação daquela nota.

 

 

Ainda tem o RESTRICT mas acaba sendo a mesma coisa do NO ACTION, que, se um comando de ADD CONSTRANIT omitir qualquer das opções acima, o padrão é NO ACTION, no MySQL!!

 

Ok mano, sakou agora?? ehehehe

 

Abração, qualquer dúvida, continue postando!! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Share this post


Link to post
Share on other sites

Vamos lá "mano", rs

 

ON DELETE NO ACTION = Exclui somente o pai sem afetar o(s) registro(s) filhos ou relacionados em outras entidades.

ON DELETE CASCADE = É o chamado cascateamento, excluindo o pai, exclui também todos os registros rrelacionados em outras tabelas. No caso de uma nota fiscal que tem muito itens, o id da nota fiscal está na tabela de itens da nota fiscal. Excluindo uma nota, você esxclui também toda a movimentação daquela nota.

 

 

 

Ainda tem o RESTRICT mas acaba sendo a mesma coisa do NO ACTION, que, se um comando de ADD CONSTRANIT omitir qualquer das opções acima, o padrão é NO ACTION, no MySQL!!

 

NO ACTION e RESTRICT são comandos muito parecidos. A principal diferença entre NO ACTION e RESTRICT é que com NO ACTION a verificação de integridade referencial é feito depois de tentar alterar a tabela. RESTRICT faz a verificação antes de tentar executar a instrução UPDATE ou DELETE. Ambas as ações referenciais agem da mesma forma, se a verificação de integridade referencial falha: a instrução UPDATE ou DELETE irá resultar em um erro.

Em outras palavras, quando uma instrução UPDATE ou DELETE é executada na tabela referenciada usando a ação referencial NO ACTION, o SGBD verifica no final da execução da instrução que nenhuma das relações referenciais são violadas. Isso é diferente no caso do RESTRICT, que assume desde o início que a operação vai violar a restrição. Usando NO ACTION, os triggers podem produzir um estado final no qual nenhuma relação de chave estrangeira é violada no momento em que a restrição está finalmente verificada, permitindo assim que a instrução seja concluída com êxito.

Share this post


Link to post
Share on other sites

NO ACTION e RESTRICT são comandos muito parecidos. A principal diferença entre NO ACTION e RESTRICT é que com NO ACTION a verificação de integridade referencial é feito depois de tentar alterar a tabela. RESTRICT faz a verificação antes de tentar executar a instrução UPDATE ou DELETE. Ambas as ações referenciais agem da mesma forma, se a verificação de integridade referencial falha: a instrução UPDATE ou DELETE irá resultar em um erro.

Em outras palavras, quando uma instrução UPDATE ou DELETE é executada na tabela referenciada usando a ação referencial NO ACTION, o SGBD verifica no final da execução da instrução que nenhuma das relações referenciais são violadas. Isso é diferente no caso do RESTRICT, que assume desde o início que a operação vai violar a restrição. Usando NO ACTION, os triggers podem produzir um estado final no qual nenhuma relação de chave estrangeira é violada no momento em que a restrição está finalmente verificada, permitindo assim que a instrução seja concluída com êxito.

 

Boa camarada!! Muito bom!!

 

Happy MySQL'ing! http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.