vitow 0 Denunciar post Postado Setembro 22, 2007 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.. Compartilhar este post Link para o post Compartilhar em outros sites
Wagner Bianchi 0 Denunciar post Postado Setembro 22, 2007 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 Compartilhar este post Link para o post Compartilhar em outros sites
vitow 0 Denunciar post Postado Setembro 22, 2007 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!!! Compartilhar este post Link para o post Compartilhar em outros sites
Wagner Bianchi 0 Denunciar post Postado Setembro 22, 2007 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 Compartilhar este post Link para o post Compartilhar em outros sites
vitow 0 Denunciar post Postado Setembro 22, 2007 beleza man,valeu mesmo a ajuda!!!obrigadaum...=) Compartilhar este post Link para o post Compartilhar em outros sites
Kaduco13 0 Denunciar post Postado Outubro 26, 2010 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. Compartilhar este post Link para o post Compartilhar em outros sites
Wagner Bianchi 0 Denunciar post Postado Outubro 26, 2010 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 Compartilhar este post Link para o post Compartilhar em outros sites
Flávio Henrique 0 Denunciar post Postado Julho 21, 2014 Bom meu caso é totalmente ao contrário meu bd não está deletando a tabela pai quando ela tem relações como eu faço para autorizar a exclusão? Compartilhar este post Link para o post Compartilhar em outros sites