2017-05-14 2 views
1

Ich mache MySQL-Datenbank, wo ich Film Tabelle haben:Trigger-Logik verursacht Fehler

  • id
  • Titel
  • Menge
  • verfügbar
  • Beschreibung

und c opy Tabelle mit Fremdschlüssel film_id:

  • id
  • film_id

Und jetzt habe ich nach DELETE-Trigger auf Kopie geschrieben:

UPDATE `film` 
      SET available = available - 1 
WHERE OLD.film_id = id; 

Und jetzt Ich möchte vor dem Löschen Trigger auf fil schreiben m, aufgrund Tatsache, dass der Film durch Kopie contrained so schreibe ich:

DELETE FROM copy WHERE copy.film_id = OLD.id; 

Hier Fehler tritt auf:

aktualisieren Tabelle kann nicht 'Film' in gespeicherte Funktion/Trigger, weil es wird bereits von der Anweisung verwendet, die diese gespeicherte Funktion/diesen Trigger aufgerufen hat.

Ich möchte Film löschen -> löschen copy -> update Film (ERROR)

+0

Wenn Sie einen Film löschen (dh eine Zeile in Film-Tabelle) im ersten Schritt, wie kann man den Film reocord aktualisieren (die das ist gelöscht) im dritten Schritt? Scheint nicht logisch. –

+0

@DarshanMehta Wenn ich Film löschen möchte muss ich alle Kopien löschen wo copy.film_id = OLD.id, aber es löst auch ein Update auf Film aus und das verursacht Problem. –

Antwort

2

Es sieht aus wie Sie die trigger überhaupt nicht brauchen. Stattdessen können Sie FOREIGN KEY so konfigurieren, dass Einträge in der Tabelle copy gelöscht werden, wenn ein übergeordneter Datensatz in film gelöscht wird. Werfen Sie einen Blick auf die Dokumentation von MySQL here. Sie müssen CASCADE Option verwenden:

CASCADE: Löschen oder die Zeile aus der übergeordneten Tabelle aktualisieren und automatisch löschen oder die passenden Zeilen in der untergeordneten Tabelle aktualisieren. Sowohl ON DELETE CASCADE als auch ON UPDATE CASCADE werden unterstützt.

Dies ist, wie die FOREIGN KEY Syntax aussehen wird:

CONSTRAINT fk_film_id FOREIGN KEY (film_id) REFERENCES film(id) ON DELETE CASCADE;