web-dev-qa-db-fra.com

Supprimer les lignes SQL où les ID n'ont pas de correspondance dans une autre table

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 blobfileid 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.

138
Martin

Utilisation de LEFT JOIN/IS NULL:

DELETE b FROM BLOB b 
  LEFT JOIN FILES f ON f.id = b.fileid 
      WHERE f.id IS NULL

Utilisation de NOT EXISTS:

DELETE FROM BLOB 
 WHERE NOT EXISTS(SELECT NULL
                    FROM FILES f
                   WHERE f.id = fileid)

Utilisation de NOT IN:

DELETE FROM BLOB
 WHERE fileid NOT IN (SELECT f.id 
                        FROM FILES f)

Attention

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.

286
OMG Ponies
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...*/
      )
26
Martin Smith
DELETE FROM blob
WHERE NOT EXISTS (
    SELECT *
    FROM files
    WHERE id=blob.id
)
14
George
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);
0
Kamrujjaman Khan