J'essaie de supprimer des entrées orphelines dans une table mysql.
J'ai 2 tables comme ça:
Table 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.
Je veux supprimer toutes les lignes de la table blob
où fileid
ne peut pas être trouvé dans la table files.id
.
Nous allons donc utiliser l'exemple ci-dessus pour supprimer les lignes: 3 & 4(s) dans la table blob
.
DELETE b FROM BLOB b
LEFT JOIN FILES f ON f.id = b.fileid
WHERE f.id IS NULL
DELETE FROM BLOB
WHERE NOT EXISTS(SELECT NULL
FROM FILES f
WHERE f.id = fileid)
DELETE FROM BLOB
WHERE fileid NOT IN (SELECT f.id
FROM FILES f)
Dans la mesure du possible, effectuez des opérations DELETE au sein d'une transaction (dans la mesure où elles sont prises en charge - IE: pas sur MyISAM) afin de pouvoir utiliser la restauration pour annuler les modifications en cas de problème.
DELETE FROM blob
WHERE fileid NOT IN
(SELECT id
FROM files
WHERE id is NOT NULL/*This line is unlikely to be needed
but using NOT IN...*/
)
DELETE FROM blob
WHERE NOT EXISTS (
SELECT *
FROM files
WHERE id=blob.id
)
delete from table1 t1
WHERE not exists (select id from table2 where related_field_in_t2=t1.id)
AND not exists (select id from table3 where related_field_in_t3=t1.id)
AND not exists (select id from table4 where related_field_t4=t1.id)
AND not exists (select id from table5 where related_field_t5=t1.id);