J'essaye de supprimer les entrées orphelines dans une table mysql.
J'ai 2 tables comme celle-ci:
Tableau files
:
| id | ....
------------
| 1 | ....
| 2 | ....
| 7 | ....
| 9 | ....
table blob
:
| fileid | ....
------------
| 1 | ....
| 2 | ....
| 3 | ....
| 4 | ....
| 4 | ....
| 4 | ....
| 9 | ....
Les colonnes fileid
et id
peuvent être utilisées pour joindre les tables ensemble.
Je veux supprimer toutes les lignes de la table blob
qui fileid
ne peuvent pas être trouvées dans la table files.id
.
Donc, en utilisant l'exemple ci-dessus, cela supprimerait les lignes: 3 et 4 (s) dans le blob
tableau.
null
s.Réponses:
En utilisant LEFT JOIN / IS NULL:
Utilisation de NOT EXISTS:
Utilisation de NOT IN:
avertissement
Dans la mesure du possible, effectuez des SUPPRESSIONS dans une transaction (en supposant qu'il soit pris en charge - IE: Pas sur MyISAM) afin que vous puissiez utiliser la restauration pour annuler les modifications en cas de problèmes.
la source
fileid
est non annulable . De plus, la troisième solution (NOT IN
) ne nécessite quef.id
par non nullable. Il s'agit probablement d'une clé primaire, ce serait donc le cas.la source
NOT IN (NULL)
renvoie un jeu de résultats vide, les NULL doivent donc être exclus. Mais uneid
colonne ne sera probablement pas annulable de toute façon, donc "peu probable d'être nécessaire"not in(null)
est assez logique, pourquoi ça ne marche pas? Quelle est la raison derrière cela?unknown
et tout est soitfalse
ouunknown
et ne peut jamais être évalué àtrue
la source
files.id
etblob.fileid
. Je suppose que votre requête entraînera une erreur.la source
NOT EXISTS
était déjà publié il y a 9 ans. 4. Vous n'avez pas fait la promotion de la meilleure pratique consistant à utiliser systématiquement toutes les majuscules pour les mots clés MySQL. En d'autres termes, il n'y a rien ici qui vaille la peine d'être gardé - c'est pourquoi j'ai également voté pour supprimer ce message.