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
?
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'
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
La deuxième possibilité est,
UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
);
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**
;
--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);
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é