J'essaie de mettre à jour une table MySQL en fonction des informations d'une autre.
Ma table original
ressemble à ceci:
id | value
------------
1 | hello
2 | fortune
3 | my
4 | old
5 | friend
Et la table tobeupdated
ressemble à ceci:
uniqueid | id | value
---------------------
1 | | something
2 | | anything
3 | | old
4 | | friend
5 | | fortune
Je veux mettre à jour id
dans tobeupdated
avec le id
de original
basé sur value
(chaînes stockées dans VARCHAR(32)
champ).
Le tableau mis à jour devrait ressembler à ceci:
uniqueid | id | value
---------------------
1 | | something
2 | | anything
3 | 4 | old
4 | 5 | friend
5 | 2 | fortune
J'ai une requête qui fonctionne, mais elle est très lente:
UPDATE tobeupdated, original
SET tobeupdated.id = original.id
WHERE tobeupdated.value = original.value
Cela limite le nombre de processeurs et conduit éventuellement à un délai d'expiration avec seulement une fraction des mises à jour effectuées (plusieurs milliers de valeurs doivent correspondre). Je sais que la correspondance par value
sera lente, mais ce sont les seules données pour lesquelles je dois les faire correspondre.
Y at-il un meilleur moyen de mettre à jour des valeurs comme celle-ci? Je pourrais créer une troisième table pour les résultats fusionnés, si cela serait plus rapide?
J'ai essayé MySQL - Comment mettre à jour une table avec les valeurs d'une autre table? , mais cela n'a pas vraiment aidé. Des idées?
Merci d'avance d'aider un novice MySQL!
UPDATE tobeupdated
INNER JOIN original ON (tobeupdated.value = original.value)
SET tobeupdated.id = original.id
Cela devrait le faire et c'est vraiment ce que vous faites. Cependant, je préfère la syntaxe 'JOIN' pour les jointures plutôt que plusieurs conditions 'WHERE', je pense que c'est plus facile à lire
En ce qui concerne la lenteur, quelle est la taille des tables? Vous devriez avoir des index sur tobeupdated.value
et original.value
EDIT: on peut aussi simplifier la requête
UPDATE tobeupdated
INNER JOIN original USING (value)
SET tobeupdated.id = original.id
USING
est un raccourci lorsque les deux tables d'une jointure ont un nom identique nommé key
tel que id
. c'est-à-dire une équi-jointure - http://en.wikipedia.org/wiki/Join_ (SQL) # Equi-join
Cela dépend de l’utilisation de ces tables, mais vous pouvez envisager de placer le déclencheur sur la table originale lors de l’insertion et de la mise à jour. Lorsque l'insertion ou la mise à jour est terminée, mettez à jour la deuxième table en fonction d'un seul élément de la table d'origine. Ce sera plus rapide.