sql >> Database teknologi >  >> RDS >> Mysql

Sådan bruger du DELETE ON CASCADE på mange-til-en relation

ON DELETE CASCADE er en måde at slette en række på, når en række, den refererer til, slettes. Det betyder:

  • Du har en række i tabel A
  • Du har en række i tabel B, der refererer til en række i tabel A
  • Du sletter rækken i tabel A
  • Databasen sletter den tilsvarende række i tabel B

Så du har varer, og hver vare tilhører en bestemt kategori. I din varetabel har du et kategori_id (og ret venligst din stavning), der refererer til en række i kategoritabellen. Så i din situation:

  • Du har en kategori
  • Du har et element, der refererer til en kategori
  • Du sletter en kategori
  • Databasen sletter alle de elementer, der svarer til den kategori

Det, du beder om, er lidt omvendt:

  • Du har varer
  • Du sletter det sidste element i en bestemt kategori
  • Databasen går hen og finder den kategori og sletter den

Der er ingen måde at gøre dette med ON DELETE CASCADE , af to grunde:

  1. Hvordan vil du oprette en tom kategori, før du indsætter dit første element i den? Databasen skulle slette den med det samme.
  2. Databasen ville skulle gøre en masse ekstra arbejde med at scanne tabellen. Den "ved" ikke, at vare #23082 var den sidste vare i kategorien; det skulle på en eller anden måde være at holde styr på antallet af elementer i kategorien for at gøre det.

Alt dette stammer fra det faktum, at ON DELETE CASCADE er en måde at vedligeholde referentiel integritet . Det vil sige, det er en måde for databasen at give dig en stærk garanti for, at hvis du ser kategori #20393 på vare #9847, når du går og kigger efter kategori #20393 ved du den eksisterer . Det er ikke en arbejdsbesparende enhed. :) Dette er grunden til, at de andre muligheder er ON DELETE SET NULL og ON DELETE RESTRICT :de garanterer også integritet, men i stedet for at slette fjerner de den dårlige reference eller forhindrer den oprindelige sletning i at finde sted.

Så svaret er, at du enten bliver nødt til at skrive et cron-job for med jævne mellemrum at rense den tabel eller bruge en form for ON DELETE-trigger, hvis du er bekymret for tomme kategorier.




  1. Sådan tilføjer du en mulighed til sql_mode i MySQL uden at miste eksisterende indstillinger

  2. convert_tz returnerer null

  3. Sådan arbejder du med PostgreSQL-databaser

  4. fjernelse af millisekunder fra et oracle tmstmp-felt