Guga01 0 Denunciar post Postado Junho 3, 2010 Olá pessoal! Estou com uma dúvida sobre chave estrangeira. Estou desenvolvendo um sistema em php com mysql e a estrutura das tabelas é mais ou menos assim: CREATE TABLE `cidades` ( `id` int(4) NOT NULL auto_increment, `uf` varchar(2) collate latin1_general_ci default '', `cidade` varchar(100) collate latin1_general_ci default '', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci; CREATE TABLE `bairros` ( `id` int(4) NOT NULL auto_increment, `nome` varchar(100) collate latin1_general_ci default '', `idCidade` int(4) NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`idCidade`) REFERENCES cidades(`id`) ON DELETE RESTRICT ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci; CREATE TABLE `logradouros` ( `id` int(4) NOT NULL auto_increment, `tipo` varchar(20) collate latin1_general_ci default '', `nome` varchar(100) collate latin1_general_ci default '', `idBairro` int(4) NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`idBairro`) REFERENCES bairros(`id`) ON DELETE RESTRICT ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci; Uma vez li um artigo onde se falava que não era recomendado definir CASCADE no ON DELETE por ser perigoso e correr o risco de apagar tudo. Devia ter CASCADE apenas no ON UPDATE. Mas aí pensei o seguinte: E se o usuário quiser apagar uma cidade, mesmo sendo RESTRICT, as informações ligadas a essa cidade não ficarão perdidas? Quando vai se excluir um dado que possui "dados filhos" não deve ser excluído tudo que depende dele? Ou seja, não deve ser usado CASCADE no ON DELETE? E se for isso mesmo, quando que se deve usar RESTRICT no ON DELETE? Agradeço se puderem tirar essa minha dúvida. Obrigado! Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Junho 3, 2010 O Cascade deve ser usado quando a tabela da fk e dependente da outra. Exemplos nota fiscal x itens da nota fiscal não faz sentido manter itens de uma nota deletada >> cascade endereços x unidades da federação deletar um endereço não manda Mato Grosso do Sul para o espaço >> set null (ou outro) Compartilhar este post Link para o post Compartilhar em outros sites
Guga01 0 Denunciar post Postado Junho 4, 2010 Olá Motta! Obrigado pelo retorno. Então, neste meu exemplo tanto ON DELETE quanto ON UPDATE devem ser CASCADE? Obrigado! Compartilhar este post Link para o post Compartilhar em outros sites