web-dev-qa-db-fra.com

Mettre à jour une table MySQL avec les valeurs d'une autre

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!

84
Superangel
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

184
wired00

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.

0
firegnom