1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Vereinfachung dieser Abfrage

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von jetwork, 23 Februar 2015.

  1. jetwork

    jetwork Fleissiger Benutzer

    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:

    Zuletzt bearbeitet: 23 Februar 2015
  2. ukulele

    ukulele Datenbank-Guru

    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.
     
  3. akretschmer

    akretschmer Datenbank-Guru


    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden