heinetz: Delete über mehrere Tabellen

Hallo Forum,

folgendes SQL-Statement gibt einen Datensatz zurück:

SELECT * FROM `produkte`  
LEFT JOIN `produkte_eigenschaften` ON  
`produkte`.`id` = `produkte_eigenschaften`.`produkt_id`  
WHERE `produkte`.`id` = 1  

... der die Werte aus produkte mit id=1 und die Werte
aus produkte\_eigenschaften mit produkt\_id=1 anzeigt.

Um in produkte den Datensatz mit der id=1 und in
produkte\_eigenschaften mit produkt\_id=1 gleichzeitig
zu löschen funktioniert folgendes SQL-Statement:

  
DELETE `produkte`, `produkte_eigenschaften` FROM `produkte`, `produkte_eigenschaften`  
WHERE `produkte`.`id` = `produkte_eigenschaften`.`produkt_id`  
AND `produkte`.`id` = 2  

Im ersten Select-Statement habe ich "LEFT JOIN" verwendet,
weil es vorkommen kann, dass es in der Tabelle produkte\_eigenschaften garkeine Entsprechung gibt. Dann
werden mir die vermeintlichen Felder aus produkte\_eigenschaften
als NULL angezeigt.

In diesem Fall funktioniert mein zweites Statement zum Löschen
nichtmehr, denn die Verknüpfung zwischen den Tabellen:

WHERE produkte.id=produkte_eigenschaften.produkt_id``

... besteht ja nicht mehr. Wie lässt sich das Verhalten des
LEFT JOIN auf mein Delete-Statement übertragen ?

danke für Tipps und

beste grüsse,
heinetz

  1. Hallo heinetz!

    ON DELETE CASCADE würde mir spontan einfallen.

    Eventuell musst du dafür aber deine Tabellenstrukturen ändern.

    I Carsten

  2. Hallo,

    Um in produkte den Datensatz mit der id=1 und in
    produkte\_eigenschaften mit produkt\_id=1 gleichzeitig
    zu löschen funktioniert folgendes SQL-Statement:

    DELETE produkte, produkte_eigenschaften FROM produkte, produkte_eigenschaften
    WHERE produkte.id = produkte_eigenschaften.produkt_id
    AND produkte.id = 2

      
    das ist, vorsichtig formuliert, Unsinn und sollte einen Syntaxfehler produzieren. Es heißt  
      
    DELETE FROM  
        produkte  
      
    und nicht  
      
    DELETE  
        spaltenliste  
    FROM  
        produkte  
      
      
    den Hinweis auf einen [FOREIGN-KEY-Constraint mit ON DELETE CASCADE](https://forum.selfhtml.org/?t=191706&m=1278590) hast Du bereits bekommen. Du könntest auch die zweite oder dritte Syntax verwenden, die im Handbuch angegeben ist:  
      
    DELETE FROM  
        p,  
        pe  
    USING  
        produkte p  
    LEFT JOIN  
        produkte\_eigenschaften pe  
    ON  
        p.id = pe.produkt\_id  
    WHERE  
        <Einschränkungen>  
      
      
    Freundliche Grüße  
      
    Vinzenz
    
    1. Hi,

      ich hab es nun so hinbekommen:

        
      DELETE  
      p.*,  
      pe.*  
      FROM `produkte` AS p  
      LEFT JOIN `produkte_eigenschaften`  
      AS pe ON p.`id` = pe.`produkt_id`  
      WHERE (  
      p.`id` = pe.`produkt_id` AND p.`id` = 10)  
      OR p.`id` = 10  
      );  
      
      

      Um in produkte den Datensatz mit der id=1 und in
      produkte\_eigenschaften mit produkt\_id=1 gleichzeitig
      zu löschen funktioniert folgendes SQL-Statement:

      DELETE produkte, produkte_eigenschaften FROM produkte, produkte_eigenschaften
      WHERE produkte.id = produkte_eigenschaften.produkt_id
      AND produkte.id = 2

      
      >   
      > das ist, vorsichtig formuliert, Unsinn und sollte einen Syntaxfehler produzieren.  
        
      ... tut es aber nicht, sonst hätte ich nicht behauptet.  
      Da mir diese Notation auch nicht bekannt war, wäre ich  
      auch nicht darauf gekommen, wenn ich es nicht [hier](http://dev.mysql.com/doc/refman/5.0/en/delete.html)  
      gelesen hätte.  
        
      gruesse,  
      heinetz