Ir para conteúdo

POWERED BY:

Arquivado

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

Guga01

Chave estrangeira

Recommended Posts

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

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

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

×

Informação importante

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