Zeilen aus zwei Tabellen in einer Abfrage löschen

7

Ich habe zwei Tabellen: orders und orders_items. Beide teilen das Feld orderID.

Ich möchte alle Zeilen aus beiden Tabellen löschen, wo orderID = 500, aber ich muss dies in nur einer Abfrage tun. Ist das möglich?

    
The Disintegrator 27.08.2009, 09:14
quelle

6 Antworten

8

Sie können die Tabelle mit ON DELETE CASCADE definieren. Wenn Sie das tun, müssen Sie nur in der Auftragstabelle löschen. Die Einträge in anderen Tabellen, in denen order_id als Fremdschlüssel mit dieser Option verwendet wird, werden automatisch gelöscht.

Dieses Beispiel stammt aus dem MySQL-Handbuch :

%Vor%

Beachten Sie, dass die Engine InnoDB ist.

    
yeyeyerman 27.08.2009, 09:16
quelle
10

Sicher kannst du das tun:

%Vor%

siehe Ссылка

[BEARBEITEN:]

Das ist der ganze Trick:

%Vor%

Wenn orderId ein varchar ist, ändern Sie die Anweisung in = '500' .

    
Residuum 27.08.2009 09:18
quelle
3

Das hängt von Ihrer Datenbank-Engine ab, aber das, was Sie brauchen, klingt so, als wollten Sie eine Tabelle mit der Option FOREIGN KEY mit ON DELETE CASCADE auf die andere verweisen und dann die Entfernung aus der übergeordneten Tabelle automatisch die entsprechenden Zeilen aus abhängigen Tabellen entfernen.

    
Michael Krelin - hacker 27.08.2009 09:20
quelle
2

Hier ist eine einfache Lösung, wenn Sie MySQL / PgSQL verwenden ...

%Vor%

Garantiert, um wie ein Charme zu arbeiten!

Stellen Sie sicher, dass in Ihrem Fall table1 und table2 durch entsprechende Tabellennamen ersetzt werden.

Ich habe viele dieser Abfragen in meinem benutzerdefinierten CMS verwendet - wo immer ich zwei unterschiedliche atomare Abfragen vermeiden wollte. Das ist so gut wie ein kaskadierendes Löschen, und die Abfrage kann so erweitert werden, dass sie so viele Tabellen umfasst, wie Sie möchten.

Hier ist ein weiteres Beispiel mit 3 Tabellen:

%Vor%

Prost, m ^ e

    
miCRoSCoPiC_eaRthLinG 27.08.2009 09:29
quelle
2

Wenn Sie InnoDB (oder eine Speicher-Engine, die diese unterstützt) verwenden, können Sie FOREIGN KEY constraints um die entsprechenden Zeilen zu löschen. Dies ist einer der einfachsten / sichersten Ansätze, wenn Sie die geringe Auswirkung von Fremdschlüsseln auf die Leistung nicht stören. Beachten Sie jedoch, dass Zeilen, die aufgrund von Einschränkungen gelöscht wurden, keine auszulösenden Trigger erhalten.

Alternativ können Sie Trigger verwenden. Sie arbeiten mit jeder Speicher-Engine und sie sind normalerweise einfach genug, um zu schreiben. Ich mag sie, aber sie sind nicht sehr performant, wenn Sie eine große Anzahl von Zeilen gleichzeitig löschen (mehrere hundert oder tausend).

%Vor%

Schließlich könnten Sie, wie in einer vorherigen Antwort vorgeschlagen, DELETE mit mehreren Tabellen verwenden:

%Vor%     
Josh Davis 27.08.2009 09:35
quelle
1

Könnten Sie eine gespeicherte Funktion verwenden und diese aufrufen?

Und dann würden Sie innerhalb Ihrer gespeicherten Funktion beide DELETE-Abfragen haben. Wenn dann die gespeicherte Funktion aufgerufen wird, wird sie als eine Transaktion ausgeführt und Sie können alles zurückgeben, was Sie möchten.

    
Evernoob 27.08.2009 09:15
quelle

Tags und Links