sql >> Base de Datos >  >> RDS >> Mysql

Cómo usar DELETE ON CASCADE en una relación de muchos a uno

ON DELETE CASCADE es una forma de eliminar una fila cuando se elimina una fila a la que hace referencia. Esto significa:

  • Tiene una fila en la tabla A
  • Tiene una fila en la tabla B que hace referencia a una fila en la tabla A
  • Eliminas la fila en la tabla A
  • La base de datos elimina la fila correspondiente en la tabla B

Así que tienes artículos, y cada artículo pertenece a una categoría particular. En su tabla de elementos, tiene un category_id (y corrija la ortografía) que se refiere a una fila en la tabla de categorías. Entonces, en tu situación:

  • Tienes una categoría
  • Tienes un artículo que hace referencia a una categoría
  • Eliminas una categoría
  • La base de datos elimina todos los elementos que corresponden a esa categoría

Lo que estás pidiendo es al revés:

  • Tienes artículos
  • Eliminas el último elemento de una categoría en particular
  • La base de datos busca esa categoría y la elimina

No hay forma de hacer esto con ON DELETE CASCADE , por dos razones:

  1. ¿Cómo va a crear una categoría vacía antes de insertar su primer elemento en ella? La base de datos tendría que eliminarlo inmediatamente.
  2. La base de datos tendría que hacer mucho trabajo extra escaneando la tabla. No "sabe" que el artículo #23082 fue el último artículo en la categoría; tendría que hacer un seguimiento de la cantidad de elementos en la categoría para hacer eso.

Todo esto se debe al hecho de que ON DELETE CASCADE es una forma de mantener la integridad referencial . Es decir, es una forma de que la base de datos le brinde una fuerte garantía de que si ve la categoría n.º 20393 en el elemento n.º 9847, cuando busque la categoría n.º 20393 sabrá que existe . No es no un dispositivo de ahorro de mano de obra. :) Esta es la razón por la que las otras opciones son ON DELETE SET NULL y ON DELETE RESTRICT :también garantizan la integridad, pero en lugar de eliminar, eliminan la mala referencia o evitan que se produzca la eliminación original.

Entonces, la respuesta es que tendrá que escribir un trabajo cron para limpiar periódicamente esa tabla o usar algún tipo de activador ON DELETE, si le preocupan las categorías vacías.