MySql Kaskade löschen aus 2 Tabellen

8

Ich habe ein MySql-Schema, das die Vererbung von Klassentabellen verwendet, aber ich möchte, dass die untergeordneten Tabellen von der Elterntabelle und eine Fremdtabelle.

%Vor%

Wenn ein Datensatz aus einer der Fremdtabellen gelöscht wird, wird der Datensatz aus der untergeordneten Tabelle, aber nicht aus der übergeordneten Tabelle gelöscht. Ich möchte nicht eine gespeicherte Prozedur / Multi-Anweisung als Lösung verwenden, weil die Fremdtabellen eigene Kaskadenlöschungen haben, also würde ich auch gespeicherte Prozeduren für diese benötigen.

    
JSarwer 17.03.2016, 15:11
quelle

1 Antwort

11

ON DELETE CASCADE löscht die Zeile in der Tabelle mit dem Fremdschlüssel (untergeordnet), wenn die Zeile in der Tabelle, auf die verwiesen wird (übergeordnet), gelöscht wird. Ohne ON DELETE CASCADE würde die Zeile mit dem Fremdschlüssel (Kind) auf eine Zeile (Eltern) zeigen, die nicht mehr existiert, und Sie würden INTEGRITY CONSTRAINT VIOLATION erhalten.

Umgekehrt gibt es kein Problem, das Löschen des untergeordneten Elements ohne Löschen des übergeordneten Elements lässt keine verwaisten Zeilen und für MySQL keine INTEGRITY CONSTRAINT VIOLATION zu, und es ist keine Kaskade erforderlich.

Wenn Sie die untergeordnete, übergeordnete und die andere referenzierte Zeile zusammen löschen möchten, haben Sie einige Optionen.

Multistatement / Verfahren :

  • Lösche zuerst das Kind, dann das Elternteil und dann den anderen Datensatz (keine Notwendigkeit für ON DELETE CASCADE s)
  • Löschen Sie zuerst das Kind, dann den anderen Datensatz und dann den Elternteil (keine Notwendigkeit für ON DELETE CASCADE s)
  • Löschen Sie zuerst den übergeordneten und dann den anderen Datensatz (nur ON DELETE CASCADE für die übergeordnete Referenz)
  • Löschen Sie zuerst den anderen Datensatz und dann den übergeordneten Datensatz (nur ON DELETE CASCADE für die andere Referenz)

Auslöser :

  • Setzen Sie einen Trigger auf AFTER DELETE in der Child-Tabelle, die den übergeordneten und den anderen Datensatz löscht (in beliebiger Reihenfolge), dann löscht das Kind alle drei Datensätze (keine Notwendigkeit für ON DELETE CASCADE s)

Ändern Sie die Beziehung:

  • Wenn Sie die Beziehung zu der anderen Tabelle (a oder b) so ändern können, dass sie auf das untergeordnete Element und nicht auf das untergeordnete Objekt verweist, das auf die andere Tabelle verweist (wie Sie derzeit haben), und behalten Sie den ON DELETE CASCADE s bei Zeile löscht das Kind und dann die andere Aufzeichnung der Reihe nach.
Arth 23.03.2016, 15:56
quelle

Tags und Links