web-dev-qa-db-fra.com

colonne de mise à jour mysql avec la valeur d'une autre table

J'ai deux tables qui ressemblent toutes les deux

id  name  value
===================
1   Joe     22
2   Derk    30

Je dois copier la valeur de value de tableA à tableB en fonction du nom du contrôle dans chaque table.

Des conseils pour cette déclaration UPDATE?

173
LeoSam

En plus de cette réponse, si vous devez modifier tableB.value en fonction de tableA.value dynamiquement, vous pouvez faire par exemple:

UPDATE tableB
INNER JOIN tableA ON tableB.name = tableA.name
SET tableB.value = IF(tableA.value > 0, tableA.value, tableB.value)
WHERE tableA.name = 'Joe'
324
RafaSashi

vous devez joindre les deux tables: 

par exemple, vous voulez copier la valeur de name de tableA dans tableB où ils ont la même ID

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.id = t2.id
SET t1.name = t2.name 
WHERE t2.name = 'Joe'

MISE À JOUR 1

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.id = t2.id
SET t1.name = t2.name 

MISE À JOUR 2

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.name = t2.name
SET t1.value = t2.value
136
John Woo

La deuxième possibilité est,

UPDATE TableB 
SET TableB.value = (
    SELECT TableA.value 
    FROM TableA
    WHERE TableA.name = TableB.name
);
76
Samir Alajmovic

La deuxième option est également réalisable si vous utilisez le mode de mise à jour en toute sécurité (et si vous obtenez une erreur indiquant que vous avez essayé de mettre à jour une table sans un WHERE utilisant une colonne KEY), en ajoutant: 

UPDATE TableB  
SET TableB.value = (  
SELECT TableA.value  
    FROM TableA  
    WHERE TableA.name = TableB.name  
)  
**where TableB.id < X**  
;
3
raul7

--Stockez vos données dans temp table Sélectionnez * dans tempTable à partir de table1

--Maintenant, mettez à jour la colonne UPDATE table1 SET table1.NomFichier = (sélectionnez NomFichier à partir de tempTable où tempTable.id = table1.ID);

0
Abid Mahmood

Dans mon cas, la solution acceptée était trop lente. Pour une table comportant 180 000 lignes, le taux de mises à jour était d'environ 10 lignes par seconde. C'est avec les index sur les éléments de jointure.

J'ai finalement résolu mon problème en utilisant une procédure:

CREATE DEFINER=`my_procedure`@`%` PROCEDURE `rescue`()
BEGIN
    declare str VARCHAR(255) default '';
    DECLARE n INT DEFAULT 0;
    DECLARE i INT DEFAULT 0;
    DECLARE cur_name VARCHAR(45) DEFAULT '';
    DECLARE cur_value VARCHAR(10000) DEFAULT '';
    SELECT COUNT(*) FROM tableA INTO n;
    SET i=0;
    WHILE i<n DO 
      SELECT namea,valuea FROM tableA limit i,1 INTO cur_name,cur_value;
      UPDATE tableB SET nameb=cur_name where valueb=cur_value;
      SET i = i + 1;
    END WHILE;

END

J'espère que cela aidera quelqu'un à l'avenir, comme cela m'a aidé

0
justadev