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:- Como você vai criar uma categoria vazia antes de inserir seu primeiro item nela? O banco de dados teria que excluí-lo imediatamente.
- 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.