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?
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.
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.
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
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%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.