Hier ist das Skript zum Erstellen meiner Tabellen:
CREATE TABLE clients (
client_i INT(11),
PRIMARY KEY (client_id)
);
CREATE TABLE projects (
project_id INT(11) UNSIGNED,
client_id INT(11) UNSIGNED,
PRIMARY KEY (project_id)
);
CREATE TABLE posts (
post_id INT(11) UNSIGNED,
project_id INT(11) UNSIGNED,
PRIMARY KEY (post_id)
);
In meinem PHP-Code möchte ich beim Löschen eines Clients alle Projektbeiträge löschen:
DELETE
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id;
Die Beiträge Tabelle nicht über einen Fremdschlüssel client_id
nur project_id
. Ich möchte die Beiträge in Projekten löschen, die bestanden haben client_id
.
Dies funktioniert momentan nicht, da keine Beiträge gelöscht werden.
DELETE posts FROM posts JOIN projects ...
eher ein als einIN (subquery)
Muster. (Die Antwort von Yehosef gibt ein Beispiel für das bevorzugte Muster.)alias
den Tabellennamen verwenden und diesen verwenden.Antworten:
Sie müssen nur angeben, dass Sie die Einträge aus der
posts
Tabelle löschen möchten :BEARBEITEN: Weitere Informationen finden Sie in dieser alternativen Antwort
quelle
DELETE d FROM posts AS d JOIN projects AS p ON ...
DELETE posts , projects FROM posts INNER JOIN projects ON projects.project_id = posts.project_id WHERE projects.client_id = :client_id
Da Sie mehrere Tabellen auswählen, ist die zu löschende Tabelle nicht mehr eindeutig. Sie müssen auswählen :
In diesem Fall
table_name1
undtable_name2
ist der gleiche Tisch, so wird diese Arbeit:Sie können sogar aus beiden Tabellen löschen, wenn Sie möchten:
Beachten Sie dies
order by
undlimit
funktionieren Sie nicht für Löschvorgänge mit mehreren Tabellen .Beachten Sie außerdem, dass Sie beim Deklarieren eines Alias für eine Tabelle den Alias verwenden müssen, wenn Sie auf die Tabelle verweisen:
Beiträge aus Carpetsmoker und etc .
quelle
ON
wird groß geschrieben. Für weniger erfahrene Entwickler kann dies bedeuten, dass es in Ordnung ist, chaotisch und in Bezug auf den Stil inkonsistent zu sein.Oder dasselbe mit einer etwas anderen (IMO-freundlicheren) Syntax:
Übrigens, mit MySQL ist die Verwendung von Joins fast immer viel schneller als Unterabfragen ...
quelle
USING
: stackoverflow.com/questions/11366006/mysql-on-vs-usingSie können ALIAS auch so verwenden, dass es funktioniert. Verwenden Sie es einfach in meiner Datenbank! t ist die Tabelle, aus der gelöscht werden muss!
quelle
Ich bin eher an die Unterabfragelösung gewöhnt, habe sie aber in MySQL nicht ausprobiert:
quelle
MySQL DELETE zeichnet mit JOIN auf
Im Allgemeinen verwenden Sie INNER JOIN in der SELECT-Anweisung, um Datensätze aus einer Tabelle auszuwählen, die entsprechende Datensätze in anderen Tabellen enthalten. Wir können auch die INNER JOIN-Klausel mit der DELETE-Anweisung verwenden, um Datensätze aus einer Tabelle zu löschen, sowie die entsprechenden Datensätze in anderen Tabellen, z. B. um Datensätze aus T1- und T2-Tabellen zu löschen, die eine bestimmte Bedingung erfüllen, verwenden Sie die folgende Anweisung:
Beachten Sie, dass Sie die Tabellennamen T1 und T2 zwischen DELETE und FROM setzen. Wenn Sie die T1-Tabelle weglassen, löscht die DELETE-Anweisung nur Datensätze in der T2-Tabelle, und wenn Sie die T2-Tabelle weglassen, werden nur Datensätze in der T1-Tabelle gelöscht.
Die Verknüpfungsbedingung T1.key = T2.key gibt die entsprechenden Datensätze in der T2-Tabelle an, die gelöscht werden müssen.
Die Bedingung in der WHERE-Klausel gibt an, welche Datensätze in T1 und T2 gelöscht werden müssen.
quelle
Löschen einer einzelnen Tabelle:
So löschen Sie Einträge aus der
posts
Tabelle:So löschen Sie Einträge aus der
projects
Tabelle:So löschen Sie Einträge aus der
clients
Tabelle:Mehrere Tabellen löschen:
Um Einträge aus mehreren Tabellen aus den verknüpften Ergebnissen zu löschen, müssen Sie die Tabellennamen nach
DELETE
als durch Kommas getrennte Liste angeben :Angenommen , Sie Einträge aus allen drei Tabellen löschen möchten (
posts
,projects
,clients
) für einen bestimmten Client:quelle
Versuchen Sie es wie folgt:
quelle
Eine andere Methode zum Löschen mit einer Unterauswahl, die besser ist als die Verwendung,
IN
wäreWHERE
EXISTS
Ein Grund, dies anstelle des Joins zu verwenden, ist, dass a
DELETE
withJOIN
die Verwendung von verbietetLIMIT
. Wenn Sie in Blöcken löschen möchten, um keine vollständigen Tabellensperren zu erzeugen, können SieLIMIT
dieseDELETE WHERE EXISTS
Methode hinzufügen .quelle
posts
EXISTS () dasselbe istposts
, aus dem die Zeilen gelöscht werden. (IMHO sowieso)DELETE p FROM posts p WHERE EXISTS ( SELECT 1 FROM projects WHERE projects.client_id = p.client_id);
Datensätze aus einer Tabelle löschen:
LÖSCHEN VON AUFZEICHNUNGEN AUS beiden Tabellen:
quelle
Wenn der Join für Sie nicht funktioniert, können Sie diese Lösung ausprobieren. Es dient zum Löschen verwaister Datensätze aus t1, wenn keine Fremdschlüssel verwendet werden + spezifische where-Bedingung. Das heißt, es löscht Datensätze aus Tabelle1, die ein leeres Feld "Code" haben und keine Datensätze in Tabelle2 haben, die mit dem Feld "Name" übereinstimmen.
quelle
Versuche dies,
quelle
- Beachten Sie, dass Sie keinen Alias für die Tabelle verwenden können, in der Sie löschen müssen
quelle