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

Ordem de exclusão com restrições de chave estrangeira,


Oficialmente, você não tem controle sobre a ordem das operações em cascata. Você pode abusar de alguns não documentados comportamento no entanto:
  • para MySQL 5.5, as chaves estrangeiras são executadas na ordem em que foram criadas, portanto, descartando e recriando o fk_category_org -a restrição deve funcionar
  • para MySQL 5.6+, as chaves estrangeiras são executadas na ordem lexical de seus nomes, então renomeando fk_category_org para, por exemplo, fk_z_category_org deve funcionar

Isso não está documentado e pode mudar a qualquer momento (e pode ser influenciado por outros fatores).

Dito isto, a maneira correta de fazer isso (e qualquer outra coisa muito complicada para on cascade ) seria adicionar um before delete -trigger na sua organisation -table que "manualmente" exclui os usuários primeiro e depois as categorias. before delete -triggers são executados antes de on cascade (para que você possa decidir se deseja mantê-los ou não, embora provavelmente seja enganoso).

Não está totalmente claro se esse é o seu comportamento pretendido, mas atualmente, um usuário pode ter uma categoria que pertence à organização 1 enquanto ele está atribuído à organização 2. A exclusão da organização 1 ainda falharia. Parece que é isso que você quer evitar pelo seu design, mas se você quiser que a exclusão funcione também neste caso, você precisa para usar o gatilho para poder incorporá-lo (ou excluí-lo manualmente em seu aplicativo), a cascata não funcionará a menos que você também faça a cascata na tabela de categorias.