2015-08-31 6 views
1

J'ai 2 tables MySQL: termlist et blacklist. Ils ont tous les deux un index sur le champ "terme" et la liste noire a un autre index sur le champ "statut".Comment éviter l'analyse complète de la table lors de la mise à jour avec la clause IN dans MySQL

Je veux mettre à jour le statut des termes paramètre termlist, qui apparaissent également dans la liste noire avec le statut de « A » à « B », je publie cette déclaration SQL:

update termlist set status = 'B' where term in (select term from blacklist where status = 'A') 

Il provoque une analyse complète de la table sur la liste Je veux utiliser 'mise à jour avec jointure interne' mais je ne peux pas car il y a une clause where dans une instruction select. Je sais que je peux créer une table temporaire à partir de cette instruction select, puis mettre à jour la jointure interne avec cette table temporaire, mais c'est assez fastidieux si je souhaite effectuer cette mise à jour plusieurs fois.

Y a-t-il une seule instruction de mise à jour qui peut effectuer le travail sans analyse de table complète?

+0

schémas de table d'index montrant information non typée à la main s'il vous plaît, 'show create table xxx' pour chaque – Drew

+0

si cela est même nécessaire ... donc sauter ce que je viens de dire ... Vous voulez utiliser la mise à jour avec le modèle de jointure de table voir [ici] (http://stackoverflow.com/questions/15209414/mysql-update-join) – Drew

Répondre

2

Vous pourriez utiliser:

update termlist t inner join blacklist b 
    on t.term=b.term 
    set t.status = 'B' 
    where b.status = 'A' 
+0

J'utiliserai 2 tables temporaires pour essayer votre instruction. S'ils sortent la bonne réponse, je vérifierai votre réponse. –