Multi DELETE – Einfach tabellenübergreifend löschen

In einem relationalem Datenbanksystem kommt es ja des öfteren vor, dass Tabellen über ihre Schlüssel verbunden sind. Nehmen wir als Beispiel ein einfaches News System mit einer Kommentar-Funktion. Der eigentliche News Artikel wird dabei in einer Tabelle mit dem Namen News gespeichert. Die Kommentare zu diesem Artikel werden neben dem eigentlichen Artikel in einer zweiten Tabelle “NewsKommentare” gespeichert. Beide Tabellen sind über die ID eines News Artikels miteinander verbunden.

Bisher war es so, dass das Löschen eines Artikels eine aufwendige Aneinanderreihung von DELETE Anweisungen nach sich zog, um die Datenbank wirklich von allen mit dem eigentlichen Artikel zusammenhängenden Elementen zu bereinigen. Für mich als Entwickler war’s also jede Menge Code. Nach einem zufälligen Blick in die MySQL Dokumentation habe ich dann herausgefunden, dass die JOIN Syntax auch bei DELETE Anweisungen möglich ist, um über mehrere Tabellen hinweg mit einem einzigen Query zu löschen.

Beispiel:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
try {
	$sql = "
		DELETE
			news.*,
			comments.*
		FROM
			corestyleNews AS news
		LEFT JOIN
			corestyleNewsComments AS comments ON news.newsID = comments.cmtNewsID
		WHERE 
			news.newsID = :newsID 
	";
	$stmt = Admin::getDB()->prepare($sql);
	$stmt->bindParam(':newsID', $newsID, PDO::PARAM_INT);
	$stmt->execute();
 
	if ($stmt->rowCount()) {
		throw new Exception('Der Artikel und die Kommentare wurden gelöscht.');
	} else {
		throw new Exception('Der Artikel wurde nicht gelöscht.');
	}
} catch (PDOException $e) {
	die($e->getMessage());
}

In diesem Beispiel finden wir die bereits oben erwähnten Tabellen News und Kommentare wieder. Es wird hier nun ein News Artikel gelöscht und gleichzeitig werden auch die dazugehörigen Kommentare aus der Kommentar-Tabelle gelöscht. Der Bezüg wird hier mittels einer JOIN Syntax über den Schlüssel newsID hergestellt. Somit ist es möglich mit einem Query über zwei Tabellen hinweg zu löschen. Einfach und Effektiv und spart zu dem jede Menge Code, denn es müssen nicht zwei Queries abgesetzt werden.

Aktualisiert am 13. Januar 2009
Stichworte: , , ,
Kategorie Erfahrungsberichte im Umgang mit Webtechniken

3 Kommentare

Schreibe einen Kommentar · TrackBack · RSS Comments

  1. Kommentar von Sascha Schoppengerd:

    Vielen Dank für den nützlichen Tip, denn heute hatte ich gleich den ersten Anwendungsfall für diese Query.

    15. Januar 2009 @ 10:12
  2. Kommentar von Pealsedkene:

    Hello.
    more links for that topic?
    And Bye.

    27. November 2009 @ 15:23
  3. Kommentar von admin:

    Just have a look at the MySQL documentation: http://dev.mysql.com/doc/refman/5.1/de/delete.html

    27. November 2009 @ 15:28

Schreibe einen Kommentar