Delete über mehrere Tabellen
heinetz
- datenbank
1 I Carsten1 Vinzenz Mai0 heinetz
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
Hallo heinetz!
ON DELETE CASCADE würde mir spontan einfallen.
Eventuell musst du dafür aber deine Tabellenstrukturen ändern.
I Carsten
Hallo,
Um in
produkte
den Datensatz mit derid
=1 und in
produkte\_eigenschaften
mitprodukt\_id
=1 gleichzeitig
zu löschen funktioniert folgendes SQL-Statement:
DELETE
produkte
,produkte_eigenschaften
FROMprodukte
,produkte_eigenschaften
WHEREprodukte
.id
=produkte_eigenschaften
.produkt_id
ANDprodukte
.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
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 derid
=1 und in
produkte\_eigenschaften
mitprodukt\_id
=1 gleichzeitig
zu löschen funktioniert folgendes SQL-Statement:
DELETE
produkte
,produkte_eigenschaften
FROMprodukte
,produkte_eigenschaften
WHEREprodukte
.id
=produkte_eigenschaften
.produkt_id
ANDprodukte
.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