Voici le script pour créer mes tables:
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)
);
Dans mon code PHP, lors de la suppression d'un client, je souhaite supprimer tous les articles des projets:
DELETE
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id;
La table des publications n'a pas de clé étrangère client_id
, seulementproject_id
. Je souhaite supprimer les articles des projets qui ont été approuvés client_id
.
Cela ne fonctionne pas pour le moment car aucun message n'est supprimé.
DELETE posts FROM posts JOIN projects ...
, plutôt qu'unIN (subquery)
modèle. (La réponse de Yehosef donne un exemple du modèle préféré.)alias
le nom de la table et l'utiliser.Réponses:
Il vous suffit de spécifier que vous souhaitez supprimer les entrées du
posts
tableau:EDIT: Pour plus d'informations, vous pouvez voir cette réponse alternative
la source
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
Puisque vous sélectionnez plusieurs tables, la table à supprimer n'est plus sans ambiguïté. Vous devez sélectionner :
Dans ce cas,
table_name1
ettable_name2
sont la même table, donc cela fonctionnera:Vous pouvez même supprimer des deux tableaux si vous souhaitez:
Notez que
order by
etlimit
ne fonctionnent pas pour les suppressions multi-tables .Sachez également que si vous déclarez un alias pour une table, vous devez utiliser l'alias lorsque vous vous référez à la table:
Les contributions des Carpetsmoker et etc .
la source
ON
est en majuscule. Pour les développeurs moins expérimentés, cela peut signifier qu'il est OK d'être désordonné et incohérent en termes de style.Ou la même chose, avec une syntaxe légèrement différente (plus conviviale pour l'OMI):
BTW, avec mysql à l'aide de jointures est presque toujours un moyen plus rapide que les sous-requêtes ...
la source
USING
: stackoverflow.com/questions/11366006/mysql-on-vs-usingVous pouvez également utiliser ALIAS comme cela, cela fonctionne, il suffit de l'utiliser sur ma base de données! t la table doit être supprimée!
la source
Je suis plus habitué à la solution de sous-requête, mais je ne l'ai pas essayé dans MySQL:
la source
Enregistrements DELETE MySQL avec JOIN
Vous utilisez généralement INNER JOIN dans l'instruction SELECT pour sélectionner des enregistrements d'une table qui ont des enregistrements correspondants dans d'autres tables. Nous pouvons également utiliser la clause INNER JOIN avec l'instruction DELETE pour supprimer les enregistrements d'une table et également les enregistrements correspondants dans d'autres tables, par exemple, pour supprimer les enregistrements des tables T1 et T2 qui remplissent une condition particulière, vous utilisez l'instruction suivante:
Notez que vous placez les noms de table T1 et T2 entre DELETE et FROM. Si vous omettez la table T1, l'instruction DELETE supprime uniquement les enregistrements de la table T2 et si vous omettez la table T2, seuls les enregistrements de la table T1 sont supprimés.
La condition de jointure T1.key = T2.key spécifie les enregistrements correspondants dans la table T2 qui doivent être supprimés.
La condition de la clause WHERE spécifie les enregistrements du T1 et du T2 qui doivent être supprimés.
la source
Suppression d'une table unique:
Pour supprimer des entrées du
posts
tableau:Pour supprimer des entrées du
projects
tableau:Pour supprimer des entrées du
clients
tableau:Suppression de plusieurs tables:
Afin de supprimer des entrées de plusieurs tables des résultats joints, vous devez spécifier les noms de table après
DELETE
comme liste séparée par des virgules:Supposons que vous voulez supprimer des entrées de tous les trois tableaux (
posts
,projects
,clients
) pour un client particulier:la source
Essayez comme ci-dessous:
la source
Une autre méthode de suppression à l'aide d'une sous-sélection qui est meilleure que l'utilisation
IN
seraitWHERE
EXISTS
L'une des raisons d'utiliser ceci au lieu de la jointure est qu'un
DELETE
avecJOIN
interdit l'utilisation deLIMIT
. Si vous souhaitez supprimer des blocs afin de ne pas produire de verrous de table complets, vous pouvez ajouterLIMIT
utiliser cetteDELETE WHERE EXISTS
méthode.la source
posts
EXISTS () est identique àposts
la suppression des lignes. (ÀDELETE p FROM posts p WHERE EXISTS ( SELECT 1 FROM projects WHERE projects.client_id = p.client_id);
SUPPRIMER les enregistrements d'une table:
SUPPRIMER LES ENREGISTREMENTS DES DEUX tables:
la source
Si join ne fonctionne pas pour vous, vous pouvez essayer cette solution. Il sert à supprimer les enregistrements orphelins de t1 lorsque vous n'utilisez pas de clés étrangères + condition Where spécifique. C'est-à-dire qu'il supprime les enregistrements de la table1, qui ont le champ vide "code" et qui n'ont pas d'enregistrements dans la table2, correspondant par le champ "nom".
la source
Essaye ça,
la source
- Notez que vous ne pouvez pas utiliser d'alias sur la table où vous devez supprimer
la source