Ir para conteúdo

POWERED BY:

Arquivado

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

Apokalypse

ON CASCADE na mesma tabela

Recommended Posts

Fala galera!!

 

Então, queria uma ajuda de alguem mais experiente com SQL.

 

Tenho a seguinte Tabela:

 

CREATE TABLE categorias (  ID INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,  Pai INT(11) UNSIGNED NOT NULL,  Nome VARCHAR(40) NOT NULL,)TYPE=InnoDB;

Então, nesta tabela terei Categorias e subcategorias, sendo o campo Pai o responsavel para informar se o item é primário ou subcategoria.

 

Eu queria usar um ON CASCADE DELETE pra quando eu remover um ID, ele remover todos os itens onde o Pai = ID. Tentei fazer assim:

 

CREATE TABLE categorias (  ID INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,  Pai INT(11) UNSIGNED NOT NULL,  Nome VARCHAR(40) NOT NULL,  PRIMARY KEY(ID),  FOREIGN KEY(Pai)	REFERENCES categorias(ID)	  ON DELETE CASCADE	  ON UPDATE NO ACTION)TYPE=InnoDB;

O problema é que quando tento inserir alguma coisa na tabela ele me informa este erro:

#1216 - Não pode acrescentar uma linha filha: uma restrição de chave estrangeira falhou.

 

OBS: Pessoal, eu gostaria de repostas apenas sobre o problema. Não preciso de dicas de como montar isto com script. Preciso disto funcionando DENTRO do MySQL, pois estou trabalhando em um CRM muito complexo e não posso ter falhas.

 

Valeu desde já!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal! Consegui fazer funcionar. Não sei se seria o certo, mas assim funcionou:

 

CREATE TABLE categorias (  ID INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,  Pai INT(11) UNSIGNED NULL,  Nome VARCHAR(40) NOT NULL,  PRIMARY KEY(ID),  INDEX categorias_FKIndex1(Pai),  FOREIGN KEY(Pai)	REFERENCES categorias(ID)	  ON DELETE CASCADE	  ON UPDATE NO ACTION)TYPE=InnoDB;
O que eu fiz: retirei o NOT NULL do campo Pai. Não sei se ele considera o 0 (zero) como null e por isso tava dando o problema, mas assim funfou....espero que sirva de exemplo pra quem possa vir a precisar...

 

Abraço!

P.S: Se alguem souber de outra maneira, fico no aguardo!

Compartilhar este post


Link para o post
Compartilhar em outros sites

OlaDessa maneira, você poderá definir como NULL o campo da chave estrangeira. Não acredito que seja a melhor solução, pois você não terá integridade nos dados. Pra ver se eu entendi:você gostaria de inserir os seguintes dados nessa table?ID = 1, PAI = NULL, NOME = teste1ID = 2, PAI = 1, NOME = teste2Explique o caso melhor, talvez tem uma forma melhor de montar isso, do q permitir null na chave estrangeira.

Compartilhar este post


Link para o post
Compartilhar em outros sites

OlaDessa maneira, você poderá definir como NULL o campo da chave estrangeira. Não acredito que seja a melhor solução, pois você não terá integridade nos dados. Pra ver se eu entendi:você gostaria de inserir os seguintes dados nessa table?ID = 1, PAI = NULL, NOME = teste1ID = 2, PAI = 1, NOME = teste2Explique o caso melhor, talvez tem uma forma melhor de montar isso, do q permitir null na chave estrangeira.

Olá,Foi exatamente o que fiz. Deixei o campo como NULL e consegui inserir dados nele. No meu caso, deixando o campo PAI NULL não atrapalha a integridade da tabela, pois se o campo for NULL automaticamente meu sistema entende como o dado sendo Categoria Primária.Alguns me criticam por utilizar uma unica tabela para gerenciar as categorias/subcategorias dos meus sistemas. Mas as vantagens são: Ilimitadas subcategorias, pois o campo PAI diz quem pertence a quem; mais clareza na listagem de tabelas, pois dai não precisa ter tb_categ, tb_subcateg1, tb_subcateg2, blablabla....Ja trabalhei com até 15 subcategorias e não tive problema. Somente toquei neste assunto para o pessoal não dar sugestões de criar varias tabelas... ;)

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.