104 votes

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

J'essaie de mettre à jour une table MySQL à partir d'informations provenant d'une autre.

Mon original ressemble à une table :

id | value
------------
1  | hello
2  | fortune
3  | my
4  | old
5  | friend

Et le tobeupdated ressemble à une table :

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        |    | old
4        |    | friend
5        |    | fortune

Je veux mettre à jour id sur tobeupdated avec le id de original sur la base de value (chaînes de caractères stockées dans VARCHAR(32) ).

Nous espérons que le tableau mis à jour ressemblera à 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 fait tourner mon processeur à plein régime et finit par provoquer un dépassement de délai alors que seule une fraction des mises à jour est effectuée (il y a plusieurs milliers de valeurs à faire correspondre). Je sais que la correspondance par value sera lent, mais c'est la seule donnée que j'ai pour les faire correspondre.

Existe-t-il un meilleur moyen de mettre à jour des valeurs de ce type ? Je pourrais créer une troisième table pour les résultats fusionnés, si cela est 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é. Vous avez des idées ?

Merci d'avance d'aider un novice de MySQL !

230voto

wired00 Points 2951
UPDATE tobeupdated
INNER JOIN original ON (tobeupdated.value = original.value)
SET tobeupdated.id = original.id

Cela devrait suffire. En fait, il fait exactement ce que vous faites. Cependant, je préfère la syntaxe "JOIN" pour les jointures plutôt que de multiples conditions "WHERE". Je pense que c'est plus facile à lire

Si son fonctionnement est lent, 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 peut être utilisé comme raccourci lorsque les deux côtés d'une jointure ont un identique nommé ID

0voto

firegnom Points 710

Cela dépend de l'utilisation de ces tables, mais vous pourriez envisager de mettre un déclencheur sur la table d'origine lors de l'insertion et de la mise à jour et lorsque l'insertion ou la mise à jour est faite, mettre à jour la deuxième table en se basant sur un seul élément de la table d'origine, ce sera plus rapide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X