Kogima Postado Novembro 6, 2007 Denunciar Share Postado Novembro 6, 2007 Galera, eu sou iniciante e gostaria de saber se estou fazendo certo e como solucionar minha dúvida.Eu tenho uma tabela categoriacategoria (codigo_id, categoria)E uma tabela sub_categoriasub-categoria(codigo_id,categoria,sub_categoria) onde a categoria indicada aqui recebe o codigo_id da tabela categoriaCaso eu venha excluir uma categoria, como fazer para todas as sub-categorias vinculadas a essa categoria excluida sejam excluidas também Link para o comentário Compartilhar em outros sites More sharing options...
0 Denis Courcy Postado Novembro 6, 2007 Denunciar Share Postado Novembro 6, 2007 Galera, eu sou iniciante e gostaria de saber se estou fazendo certo e como solucionar minha dúvida.---Caso eu venha excluir uma categoria, como fazer para todas as sub-categorias vinculadas a essa categoria excluida sejam excluidas tambémOi, Kogima! Você tem três caminhos para solucionar este problema.O primeiro independe de versão ou engine (tipo de tabela) do Mysql. O Lado ruim é que se você estiver usando tabelas não transacionais tipo myisam e houver uma falha durante esta transação, então você ficará com tabelas inconsistentes.A técnica consiste em você deletar os dados da tabela filha e depois deletar os dados da tabela mãe.Exemplo: Sejam as tabelas Nota_Fiscal e Tabela Item_da_nota_fiscal. Para deletear os dados da nota fiscal de número 1 seria assim:DETELE FROM Item_da_nota_fiscal WHERE Numero_Nota = 1; DELETE FROM Nota_Fiscal WHERE Numero_Nota = 1; A segunda técnica você deverá estar usando a versão 4.1x ou superior (de preferência a versão 5.x) do MySQL com tabelas tipo Tansacionais INNODB ou MAXDB. Consiste em alterar a estrutura da tabela Item_da_nota_fiscal para a inclusão de constraints deste tipo: ALTER TABLE Item_da_nota_fiscal ADD CONSTRAINT FK_Item_da_nota_fiscal FOREIGN KEY(Numero_Nota) REFERENCES Nota_Fiscal (Numero_Nota) ON DELETE CASCADE ON UPDATE CASCADE; Constraint permite que uma exclusão ou atualização na tabela pai se reflita na tabela filha. Assim o comando de delete só se aplicaria a tabela pai. Outra vantagem deste tipo de comando é que você não conseguirá incluir nenhum item na tabela filha sem que antes você inclua na tabela pai. Ou seja, Tem que haver um registro na tabela pai para que haja um registro na tabela filha. O comando de deleção seria: DELETE FROM Nota_Fiscal WHERE Numero_Nota = 1;A terceira forma novamente independe de tipo de tabela mas depende de você estar usando uma versão 5.x do MySQL. Consiste em utilizar triggers.Triggers são gatilhos que são disparados quando um evento de inclusão, alteração ou exclusão ocorre em uma tabela do banco de dados.Então, você criaria uma trigger conforme eu mencionei no tópico http://scriptbrasil.com.br/forum/index.php?showtopic=109864, adaptando as suas necessidades e, depois, você usaria somente o comando de deletar na tabela pai, conforme exemplo 2.É só. Tente fazer e havendo dúvidas relate novamente.Quanto a estruturação de suas tabelas, sugiro que você leia sobre normalização de banco de dados e havendo dúvidas abra novo tópico para discutirmos a respeito.attDenis Courcy Link para o comentário Compartilhar em outros sites More sharing options...
0 Kogima Postado Novembro 6, 2007 Autor Denunciar Share Postado Novembro 6, 2007 Caramba, você explicou legal pra caramba, valeu mesmo, vo tentar fazer e qualquer coisa posto aqui de novo...Olha como ficou, utilizei o CONSTRAINT, é assim mesmo?ALTER TABLE `menu_sub_categoria` ADD CONSTRAINT `menu_sub_categoria_ibfk_1` FOREIGN KEY (`categoria`) REFERENCES `menu_categoria` (`codigo_id`) ON DELETE CASCADE ON UPDATE CASCADE; Minhas tabelas--------------------------------------------------------------------------------------------------------- CREATE TABLE `menu_categoria` ( `codigo_id` int(11) NOT NULL auto_increment, `categoria` varchar(35) NOT NULL, `loja` int(5) NOT NULL, PRIMARY KEY (`codigo_id`), UNIQUE KEY `categoria` (`categoria`,`loja`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4; CREATE TABLE `menu_sub_categoria` ( `codigo_id` int(11) NOT NULL auto_increment, `categoria` int(11) NOT NULL, `sub_categoria` varchar(150) NOT NULL, `loja` int(8) NOT NULL, `id_conteudo` int(2) NOT NULL, PRIMARY KEY (`codigo_id`), UNIQUE KEY `categoria` (`categoria`,`sub_categoria`,`loja`,`id_conteudo`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8; Link para o comentário Compartilhar em outros sites More sharing options...
0 Denis Courcy Postado Novembro 6, 2007 Denunciar Share Postado Novembro 6, 2007 (editado) Caramba, você explicou legal pra caramba, valeu mesmo, vo tentar fazer e qualquer coisa posto aqui de novo...Olha como ficou, utilizei o CONSTRAINT, é assim mesmo?ALTER TABLE `menu_sub_categoria` ADD CONSTRAINT `menu_sub_categoria_ibfk_1` FOREIGN KEY (`categoria`) REFERENCES `menu_categoria` (`codigo_id`) ON DELETE CASCADE ON UPDATE CASCADE; Minhas tabelas--------------------------------------------------------------------------------------------------------- CREATE TABLE `menu_categoria` ( `codigo_id` int(11) NOT NULL auto_increment, `categoria` varchar(35) NOT NULL, `loja` int(5) NOT NULL, PRIMARY KEY (`codigo_id`), UNIQUE KEY `categoria` (`categoria`,`loja`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4; CREATE TABLE `menu_sub_categoria` ( `codigo_id` int(11) NOT NULL auto_increment, `categoria` int(11) NOT NULL, `sub_categoria` varchar(150) NOT NULL, `loja` int(8) NOT NULL, `id_conteudo` int(2) NOT NULL, PRIMARY KEY (`codigo_id`), UNIQUE KEY `categoria` (`categoria`,`sub_categoria`,`loja`,`id_conteudo`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8;Legal! é isso mesmo.Só um detalhe que não parece muito mas em tabela muito populadas pode gastar um espaço considerável. Observe seu código quando você usou `codigo_id` int(11) NOT NULL auto_increment,você poderia ter usado `codigo_id` int(10) unsigned NOT NULL auto_increment, já que seu autoincrement não vai trabalhar com números negativos. Usar tipo unsigned pata inteiros economiza o byte de sinal que os números não unsigned necessitam.1 byte parece pouco, mas em 100.000 registros serão 100.000 bytes a menos.attDenis Courcy Editado Novembro 6, 2007 por Denis Courcy Link para o comentário Compartilhar em outros sites More sharing options...
0 Kogima Postado Novembro 6, 2007 Autor Denunciar Share Postado Novembro 6, 2007 beleza, obrigado pela ajuda e irei modificar esse detalhe do int. Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Kogima
Galera, eu sou iniciante e gostaria de saber se estou fazendo certo e como solucionar minha dúvida.
Eu tenho uma tabela categoria
categoria (codigo_id, categoria)
E uma tabela sub_categoria
sub-categoria(codigo_id,categoria,sub_categoria) onde a categoria indicada aqui recebe o codigo_id da tabela categoria
Caso eu venha excluir uma categoria, como fazer para todas as sub-categorias vinculadas a essa categoria excluida sejam excluidas também
Link para o comentário
Compartilhar em outros sites
4 respostass a esta questão
Posts Recomendados