2011-09-03 11 views
8

Que alguien me ayude. Estoy intentando algo, pero soy (demasiado) nuevo en (mi) SQL.Cómo utilizar ELIMINAR EN CASCADA en la relación uno a uno

Utilizo dos tablas: Elementos y Categorías. Table Items tiene un campo con clave foránea: category_id.

Quiero que las Categorías de la tabla se mantengan ordenadas. Por lo tanto, cuando ningún elemento en los Artículos es de categoría X en Categorías, la categoría X debe eliminarse de Categorías. ¿Cómo se establece eso? Supuse que al usar DELETE ON CASCADE, hasta ahora solo borraba los elementos correspondientes de Items cuando borraba una categoría de Categorías.

¡Muchas gracias por ayudarme!

Respuesta

35

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

  • Usted tiene una fila de la tabla A
  • Usted tiene una fila de la tabla B que hace referencia a una fila de la tabla A
  • se elimina la fila de la tabla A
  • La base de datos elimina la fila correspondiente en la tabla B

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

  • Usted tiene una categoría
  • tiene un artículo que hace referencia a una categoría
  • elimina una categoría
  • La base de datos se eliminan todos los elementos que corresponden a esa categoría

lo que estamos pidiendo es una especie de revés:

  • Tiene elementos
  • elimina el último elemento de una categoría particular
  • La base de datos va y encuentra esa categoría y lo elimina

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

  1. ¿Cómo se va a crear una categoría vacía antes de insertar su primer elemento en ella? La base de datos debería eliminarlo inmediatamente.
  2. La base de datos tendría que hacer un montón de trabajo extra escaneando la tabla. No "sabe" que el artículo # 23082 fue el último artículo en la categoría; de alguna manera debería hacer un seguimiento del número de artículos 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 manera de que la base de datos le otorgue una garantía sólida de que si ve la categoría # 20393 en el artículo # 9847, cuando vaya a buscar la categoría # 20393 , sabe que existe. 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.

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

+2

Daría +10 si pudiera. Una gran respuesta. – Shef

+0

Gran explicación. ¡Muchas gracias! –

+0

Si crees que fue una gran explicación, sería genial si aceptas esta respuesta. – itsmequinn

Cuestiones relacionadas