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
Répondre
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.
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. –
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
)
- 1. Comment sélectionner tous les enregistrements d'une table qui n'existent pas dans une autre table?
- 2. Comment supprimer tous les enregistrements d'une table ayant des enregistrements correspondants dans une autre table
- 3. Suppression de tous les enregistrements d'une table qui ne sont pas référencés à partir d'une autre table
- 4. Sélectionnez tous les éléments d'une table qui n'apparaissent pas dans une clé étrangère d'une autre table
- 5. SQL: Insérer tous les enregistrements d'une table vers une autre table sans les colonnes spécifiques
- 6. Comment récupérer tous les enregistrements qui n'ont aucune référence dans une autre table?
- 7. MySQL comment supprimer des enregistrements dans une table qui sont dans une autre table
- 8. Utilisez gréer tous les enregistrements dans une table MySQL
- 9. Requête MySQL: tous les enregistrements d'une table plus le compte d'une autre table
- 10. Supprimer tous les enregistrements d'une table
- 11. Comment sélectionner les lignes d'une table qui ne correspondent pas à une autre table dans SQL?
- 12. Sélectionnez les enregistrements avec une sous-chaîne d'une autre table
- 13. garantir les enregistrements enfants dans une table ou une autre, mais pas les deux?
- 14. SQL pour mettre à jour les enregistrements d'une table avec des enregistrements d'une autre table?
- 15. Insérer des enregistrements dans une table MySQL en fonction des valeurs existantes dans une autre table
- 16. Synchronisation de table et copie dans une autre table
- 17. SQL '08: Comment compter tous les UGS dans une table ne trouve pas dans une autre table
- 18. Sélectionner tous les enregistrements ne remplissent pas certaines conditions dans une table jointe
- 19. requête MySql pour trouver les enregistrements ne sont pas présents dans une autre table
- 20. supprimer des enregistrements de la table en utilisant une autre table?
- 21. Récupérer tous les enregistrements d'une table avec nHibernate
- 22. Comment supprimer des lignes d'une table Teradata qui ne se trouvent pas dans une autre table?
- 23. requête ne renvoyant des lignes dans une table qui n'ont pas les valeurs correspondantes dans une autre table [associative]
- 24. MySQL: sélectionne les emails d'une table seulement si ce n'est pas dans une autre table?
- 25. Comment puis-je récupérer des enregistrements d'une table et des enregistrements associés d'une autre table dans une requête?
- 26. Comment supprimer les enregistrements en double dans une table?
- 27. Joignez deux tables où tous les enregistrements enfants de la première table correspondent à tous les enregistrements enfants de la deuxième table
- 28. Comment trouver des lignes dans une table qui n'ont pas de ligne correspondante dans une autre table
- 29. Comment sélectionner les enregistrements qui correspondent aux critères définis dans une table de jointure?
- 30. Comment insérer tous les enregistrements dans une table seulement une fois
Pourriez-vous clarifier un peu? Voulez-vous supprimer des entrées des enregistrements récents ou de la plus grande table? – SilverSkin
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
Bonjour, c'est pour une boutique en ligne ZenCart, et chaque fois que le site est chargé, il essaie de beaucoup sélectionner. –