Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como usar DELETE ON CASCADE na relação muitos-para-um


ON DELETE CASCADE é uma maneira de excluir uma linha quando uma linha referenciada é excluída. Isso significa:
  • Você tem uma linha na tabela A
  • Você tem uma linha na tabela B que faz referência a uma linha na tabela A
  • Você exclui a linha na tabela A
  • O banco de dados exclui a linha correspondente na tabela B

Então você tem itens, e cada item pertence a uma categoria específica. Na sua tabela de itens, você tem um category_id (e corrija sua ortografia) que se refere a uma linha na tabela de categorias. Então, na sua situação:
  • Você tem uma categoria
  • Você tem um item que faz referência a uma categoria
  • Você exclui uma categoria
  • O banco de dados exclui todos os itens que correspondem a essa categoria

O que você está pedindo é o contrário:
  • Você tem itens
  • Você exclui o último item em uma categoria específica
  • O banco de dados encontra essa categoria e a exclui

Não há como fazer isso com ON DELETE CASCADE , por dois motivos:
  1. Como você vai criar uma categoria vazia antes de inserir seu primeiro item nela? O banco de dados teria que excluí-lo imediatamente.
  2. O banco de dados teria que fazer muito trabalho extra verificando a tabela. Ele não "sabe" que o item #23082 foi o último item da categoria; teria que, de alguma forma, acompanhar o número de itens na categoria para fazer isso.

Isso tudo decorre do fato de que ON DELETE CASCADE é uma forma de manter a integridade referencial . Ou seja, é uma forma do banco de dados dar a você uma forte garantia de que se você vir a categoria #20393 no item #9847, quando você for procurar a categoria #20393 você sabe que ela existe . Não é não um dispositivo de economia de trabalho. :) É por isso que as outras opções são ON DELETE SET NULL e ON DELETE RESTRICT :eles também garantem a integridade, mas em vez de excluir, removem a referência incorreta ou impedem que a exclusão original ocorra.

Portanto, a resposta é que você terá que escrever um cron job para limpar periodicamente essa tabela ou usar algum tipo de gatilho ON DELETE, se estiver preocupado com categorias vazias.