Vereinfachung dieser Abfrage

jetwork

Fleissiger Benutzer
Beiträge
97
Hallo Zusammen,


ich habe 2 Tabellen. Eine Haupttabelle, wo der Benutzer die Einträge (objekte) löschen darf, und eine Tabelle (hierarchy) um die Verbindungen zwischen den Objekten zu speichern.
Wenn der Benutzer aus der eigentlichen Tabelle einen Eintrag löscht, möchte ich mit Hilfe von einem Trigger aus der „hierarchy“ Tabelle die entsprechenden Einträge löschen.
Ich will aber die Einträge nur löschen wenn ein Eintrag in „Parent_id“ nur einmal vorkommt. Zum Beispiel ich darf 2 nicht löschen weil 2 mehrmals in parent_id vorkommt.
Ich darf aber die 5 löschen. Objekt 5 kommt einmal in der parent_id vor. Dann lösche ich alle Einträge, die in der child_id 5 haben. Das heißt alle Verbindungen von Objekt 5 wird gelöscht.

Tabelle: hierarchy
upload_2015-2-23_9-59-0.png


Die folgende abfrage ist in MySQL nicht möglich da ich innerhalb einem Delete keine Select aus der gleiche Tabelle machen darf.
Code:
BEGIN
DELETEFROMhierarchy
WHEREhierarchy.child_idIN(
SELECTparent_id
FROM`hierarchy`
WHEREparent_id=old.id
GROUPBYparent_id
HAVINGcount(*)=1);
END

Deswegen habe ich den Folgenden Trigger implementiert. Ich habe eine Help Tabelle erstellt nur um das Ergebniszahl zu speichern.

Code:
BEGIN
DELETEFROMhlp_tbl;
INSERTINTOhlp_tbl
(SELECTparent_id
FROM`hierarchy`
WHEREparent_id=old.id
GROUPBYparent_id
HAVINGcount(*)=1);
DELETEFROMhierarchy
WHEREhierarchy.child_idIN(
SELECTid
FROMhlp_tbl);
END


Gibt es eine Lösung diese Abfrage ohne ein help table zu machen?

Danke im Voraus
 

Anhänge

  • upload_2015-2-23_9-30-26.png
    upload_2015-2-23_9-30-26.png
    8 KB · Aufrufe: 1
Zuletzt bearbeitet:
Werbung:
Ich würde versuchen das mit ON DELETE CASCADE im Zusammenspiel mit einem Foreign Key Constraint zu lösen. In dem Fall würde CASCADE die Einträge killen solange kein Foreign Key das verhindert. Das müsstest du aber mal testen.
 
Werbung:
ich habe 2 Tabellen. Eine Haupttabelle, wo der Benutzer die Einträge (objekte) löschen darf, und eine Tabelle (hierarchy) um die Verbindungen zwischen den Objekten zu speichern.
Wenn der Benutzer aus der eigentlichen Tabelle einen Eintrag löscht, möchte ich mit Hilfe von einem Trigger aus der „hierarchy“ Tabelle die entsprechenden Einträge löschen.
Ich will aber die Einträge nur löschen wenn ein Eintrag in „Parent_id“ nur einmal vorkommt. Zum Beispiel ich darf 2 nicht löschen weil 2 mehrmals in parent_id vorkommt.


Das klingt für mich so, als ob dann in Deiner 'Haupttabelle' gelöscht wird und in der hierarchy - Tabelle noch Einträge stehen bleiben, die eine Referenz zu gelöschten Einträgen in Deiner Haupttabelle haben.

Oder kurz formuliert: das klingt kapott.

Die korrekte Implementierung wäre, wie schon von @ukulele genannt, ein Foreign Key Constraint.
 
Zurück
Oben