2010-11-04 4 views
8

J'ai une table avec beaucoup d'enregistrements (> 20.000). Il est temps de les nettoyer un peu parce que les requêtes commencent à prendre beaucoup de recours. J'ai une autre table (temporaire) avec un enregistrements récents. Tous les enregistrements de la première table qui n'existent pas dans la seconde peuvent disparaître. Cependant, j'ai besoin de conserver les identifiants pour les enregistrements récents à cause de certaines jointures, donc je ne peux pas simplement TRUNCATE, puis copier la table. Y a-t-il un moyen de le faire?Suppression de tous les enregistrements d'une table qui n'existe pas dans une autre table

+0

Pourriez-vous clarifier un peu? Voulez-vous supprimer des entrées des enregistrements récents ou de la plus grande table? – SilverSkin

+1

Notez que pour une base de données, 20k lignes est en fait une * petite * table. Si vous rencontrez des problèmes de performances, vous pouvez créer un profil et consulter les index des tables pertinentes. – Piskvor

+0

Bonjour, c'est pour une boutique en ligne ZenCart, et chaque fois que le site est chargé, il essaie de beaucoup sélectionner. –

Répondre

14
DELETE FROM old_table WHERE id NOT IN (SELECT id FROM temp_table) 

Edit:
id NOT IN (SELECT id FROM temp_table) est une construction moche. Si vous avez de grandes tables et que les paramètres de votre serveur sont réglés en mémoire insuffisante, vous l'exécuterez pour toujours.

@Piskvor La réponse est une requête plus longue, mais beaucoup mieux, qui fonctionnera mieux sur les configurations à faible mémoire. Et quand je dis «mémoire insuffisante», je veux dire les serveurs de bases de données qui ne prennent pas un ordinateur haut de gamme, donc à peu près n'importe quel système qui gère un site Web pour petites entreprises ou des choses comme ça.

+0

Merci, c'était très utile. J'aimerais cependant ajouter quelque chose pour référence future: vous devez remplacer 'id' par votre valeur unique. Pour moi, c'était le nom de l'article, puisque l'identifiant de l'enregistrement ne correspondait pas dans les deux tables. –

4

Cela vous donnera les id s des lignes qui ne sont pas une rangée correspondante (par correspondance recordid colonne - le vôtre peut être différent) dans l'autre table:

SELECT t1.id 
    FROM firsttable t1 
    LEFT JOIN secondtable t2 
WHERE t1.recordid = t2.recordid 
    AND t2.id IS NULL 

qui vous permet de vérifier que vous sélectionnez en fait les lignes correctes à supprimer. Puis, branchez-le dans un SUPPRIMER:

DELETE FROM firsttable WHERE firsttable.id IN (
    SELECT t1.id 
     FROM firsttable t1 
     LEFT JOIN secondtable t2 
    WHERE t1.recordid = t2.recordid 
     AND t2.id IS NULL 
) 
Questions connexes