sql >> Database >  >> RDS >> Mysql

Hoe DELETE ON CASCADE te gebruiken voor een veel-op-een relatie

ON DELETE CASCADE is een manier om een ​​rij te verwijderen wanneer een rij waarnaar deze verwijst wordt verwijderd. Dit betekent:

  • Je hebt een rij in tabel A
  • Je hebt een rij in tabel B die verwijst naar een rij in tabel A
  • U verwijdert de rij in tabel A
  • De database verwijdert de corresponderende rij in tabel B

Je hebt dus items en elk item behoort tot een bepaalde categorie. In je itemstabel heb je een category_id (en corrigeer je spelling a.u.b.) die verwijst naar een rij in de categorieëntabel. Dus in jouw situatie:

  • Je hebt een categorie
  • Je hebt een item dat verwijst naar een categorie
  • Je verwijdert een categorie
  • De database verwijdert alle items die overeenkomen met die categorie

Waar je om vraagt ​​is ongeveer andersom:

  • Je hebt items
  • Je verwijdert het laatste item in een bepaalde categorie
  • De database gaat en vindt die categorie en verwijdert deze

Er is geen manier om dit te doen met ON DELETE CASCADE , om twee redenen:

  1. Hoe ga je een lege categorie maken voordat je je eerste item erin invoegt? De database zou het onmiddellijk moeten verwijderen.
  2. De database zou veel extra werk moeten doen om de tabel te scannen. Het "weet" niet dat item #23082 het laatste item in de categorie was; het zou op de een of andere manier het aantal items in de categorie moeten bijhouden om dat te doen.

Dit komt allemaal voort uit het feit dat ON DELETE CASCADE is een manier om de referentiële integriteit te behouden . Dat wil zeggen, het is een manier voor de database om u een sterke garantie te geven dat als u categorie #20393 op item #9847 ziet, wanneer u op zoek gaat naar categorie #20393 u weet dat deze bestaat . Het is niet een arbeidsbesparend apparaat. :) Dit is waarom de andere opties ON DELETE SET NULL en ON DELETE RESTRICT :ze garanderen ook de integriteit, maar in plaats van te verwijderen, verwijderen ze de slechte referentie of voorkomen ze dat de oorspronkelijke verwijdering plaatsvindt.

Het antwoord is dus dat je ofwel een cron-job moet schrijven om die tabel periodiek op te schonen of een soort ON DELETE-trigger moet gebruiken als je je zorgen maakt over lege categorieën.




  1. Hoe een deel van een string in mysql te verwijderen?

  2. MaxScale Basic Management MaxCtrl gebruiken voor MariaDB Cluster

  3. Voer een batchbestand uit met de opdracht psql zonder wachtwoord

  4. JSON_STORAGE_FREE() – Ontdek hoeveel opslagruimte vrijkwam na een update van een JSON-document in MySQL