2009-04-09 26 views
7

Ich versuche, SQL zu verwenden, um mehrere Zeilen aus mehreren Tabellen zu löschen, die miteinander verbunden sind.Zeilen aus mehreren Tabellen löschen

Tabelle A Tabelle B Tabelle B verbunden ist, wird auf Tabelle C verbunden

I alle Zeilen in Tabelle B & C löschen möchten, die eine in der Tabelle an einer Zeile entsprechen

CREATE TABLE `boards` (
    `boardid` int(2) NOT NULL AUTO_INCREMENT, 
    `boardname` varchar(255) NOT NULL DEFAULT '', 
    PRIMARY KEY (`boardid`) 
); 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `messages` 
-- 

CREATE TABLE `messages` (
    `messageid` int(6) NOT NULL AUTO_INCREMENT, 
    `boardid` int(2) NOT NULL DEFAULT '0', 
    `topicid` int(4) NOT NULL DEFAULT '0', 
    `message` text NOT NULL, 
    `author` varchar(255) NOT NULL DEFAULT '', 
    `date` datetime DEFAULT NULL, 
    PRIMARY KEY (`messageid`) 
); 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `topics` 
-- 

CREATE TABLE `topics` (
    `topicid` int(4) NOT NULL AUTO_INCREMENT, 
    `boardid` int(2) NOT NULL DEFAULT '0', 
    `topicname` varchar(255) NOT NULL DEFAULT '', 
    `author` varchar(255) NOT NULL DEFAULT '', 
    PRIMARY KEY (`topicid`) 
); 

Antwort

18

Nun, wenn Sie InnoDB-Tabellen verwendet hatten, könnten Sie eine cascading delete with foreign keys einrichten, die alles automatisch tun würde. Aber wenn Sie einen Grund für die Verwendung von MyISAM haben, verwenden Sie nur ein multiple-table DELETE:

DELETE FROM boards, topics, messages 
USING boards INNER JOIN topics INNER JOIN messages 
WHERE boards.boardid = $boardid 
    AND topics.boardid = boards.boardid 
    AND messages.boardid = boards.boardid; 
+0

Warum "USING" und nicht "ON"? – pingu

+0

+1 hier danke .. – nickanor

+0

Was ist, wenn die Tabelle mehr als 50M Datensätze hat? – vikram

2

Sie können entweder nur für überprüfen Anwesenheit

delete from topics where boardid in (select boardid from boards) 
delete from messages where boardid in (select boardid from boards) 

aber dies würde nur Sinn machen, wenn dieses Verhalten nicht immer gelten soll . Wann sollte das Verhalten immer anwenden, implementieren Fremdschlüssel mit Lösch auf Kaskade

erklärt auf zig Standorten in Ihrer Hilfe-Dateien und here

1

Löschen von Zeilen aus mehreren Tabellen kann auf zwei Arten erfolgen:

  • löschen Zeilen aus einer Tabelle, welche Zeilen bestimmen, unter Bezugnahme auf eine andere Tabelle
  • löschen Zeilen aus mehreren Tabellen mit einer einzigen Anweisung löschen

DELETE-Anweisungen mit mehreren Tabellen können in zwei Formaten geschrieben werden. Das folgende Beispiel zeigt eine Syntax für eine Abfrage, die Zeilen von einer Tabelle t1 löscht, wo die ID-Werte die in einer Tabelle T2 entsprechen:

DELETE t1 FROM t1, t2 WHERE t1.id = t2.id; 

Die zweite Syntax ist etwas anders:

DELETE FROM t1 USING t1, t2 WHERE t1.id = t2.id; 

Zum löschen Sie die entsprechenden Datensätze aus beiden Tabellen sind die Aussagen:

DELETE t1, t2 FROM t1, t2 WHERE t1.id = t2.id; 
DELETE FROM t1, t2 USING t1, t2 WHERE t1.id = t2.id; 

Die ORDER BY und LIMIT-Klauseln normalerweise von UPDATE unterstützt und löschen, wenn diese Aussagen nicht erlaubt werden für Operationen mit mehreren Tabellen verwendet.

Verwandte Themen