sql >> Databáze >  >> RDS >> Mysql

Jak používat DELETE ON CASCADE ve vztahu mnoho ku jedné

ON DELETE CASCADE je způsob odstranění řádku, když je odstraněn řádek, na který odkazuje. To znamená:

  • V tabulce A máte řádek
  • V tabulce B máte řádek, který odkazuje na řádek v tabulce A
  • Smažete řádek v tabulce A
  • Databáze odstraní odpovídající řádek v tabulce B

Takže máte položky a každá položka patří do určité kategorie. V tabulce položek máte category_id (a opravte si prosím pravopis), který odkazuje na řádek v tabulce kategorií. Takže ve vaší situaci:

  • Máte kategorii
  • Máte položku, která odkazuje na kategorii
  • Smažete kategorii
  • Databáze odstraní všechny položky, které odpovídají dané kategorii

To, co požadujete, je tak trochu naopak:

  • Máte položky
  • Smažete poslední položku v konkrétní kategorii
  • Databáze najde tuto kategorii a smaže ji

Pomocí ON DELETE CASCADE to nelze nijak provést , a to ze dvou důvodů:

  1. Jak vytvoříte prázdnou kategorii, než do ní vložíte svou první položku? Databáze by ji musela okamžitě smazat.
  2. Databáze by musela vykonat spoustu práce navíc při skenování tabulky. „Neví“, že položka #23082 byla poslední položkou v kategorii; k tomu by musel nějakým způsobem sledovat počet položek v kategorii.

To vše pramení ze skutečnosti, že ON DELETE CASCADE je způsob zachování referenční integrity . To znamená, že je to způsob, jak vám databáze poskytnout silnou záruku, že když uvidíte kategorii #20393 u položky #9847, když půjdete hledat kategorii #20393, víte, že existuje . Není zařízení na úsporu práce. :) To je důvod, proč jsou další možnosti ON DELETE SET NULL a ON DELETE RESTRICT :také zaručují integritu, ale místo smazání odstraní špatnou referenci nebo zabrání původnímu smazání.

Takže odpověď je, že budete muset buď napsat úlohu cron pro pravidelné čištění této tabulky, nebo použít nějaký druh spouštěče ON DELETE, pokud se obáváte prázdných kategorií.




  1. Jak optimalizovat výkon MySQL pomocí MySQLTuner

  2. Jak otevřít DB připojení v Openshift?

  3. Jak nainstalovat MySQL 8 na Ubuntu

  4. SQL SELECT rychlost int vs varchar