Réponses:
En plus de cette réponse, si vous devez modifier dynamiquement tableB.value en fonction de tableA.value, vous pouvez 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'
UPDATE participants_registrations INNER JOIN participants ON participants.id = participants_registrations.participantId INNER JOIN registrations ON registrations.id = participants_registrations.registrationId LEFT JOIN groups ON (groups.id = registrations.groupId) SET registrations.groupId = groups.id, registrations.groupName = groups.name, participants.memberOfGroupName = groups.name
vous devez joindre les deux tables:
par exemple, vous voulez copier la valeur de name
tableA dans tableB
où ils ont le mêmeID
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
where
clause ou modifier la where
clause en fonction de vos besoins ..
La deuxième possibilité est,
UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
);
.name
est indexé sur les deux tables?
La deuxième option est également possible si vous utilisez le mode de mise à jour sécurisé (et vous obtenez une erreur indiquant que vous avez essayé de mettre à jour une table sans WHERE qui utilise 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 la table temporaire
Select * into tempTable from table1
Maintenant, mettez à jour la colonne
UPDATE table1
SET table1.FileName = (select FileName from tempTable where tempTable.id = table1.ID);
Dans mon cas, la solution acceptée était tout simplement trop lente. Pour une table avec 180K 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 ça va aider quelqu'un à l'avenir comme ça m'a aidé
Si vous avez un champ commun dans les deux tableaux, c'est si facile! ....
Table-1 = table où vous souhaitez mettre à jour. Table-2 = table d'où vous prenez les données.
$qry_asseet_list = mysql_query("SELECT 'primary key field' FROM `table-1`");
$resultArray = array();
while ($row = mysql_fetch_array($qry_asseet_list)) {
$resultArray[] = $row;
}
foreach($resultArray as $rec) {
$a = $rec['primary key field'];
$cuttable_qry = mysql_query("SELECT * FROM `Table-2` WHERE `key field name` = $a");
$cuttable = mysql_fetch_assoc($cuttable_qry);
echo $x= $cuttable['Table-2 field']; echo " ! ";
echo $y= $cuttable['Table-2 field'];echo " ! ";
echo $z= $cuttable['Table-2 field'];echo " ! ";
$k = mysql_query("UPDATE `Table-1` SET `summary_style` = '$x', `summary_color` = '$y', `summary_customer` = '$z' WHERE `summary_laysheet_number` = $a;");
if ($k) {
echo "done";
} else {
echo mysql_error();
}
}
INNER JOIN
est parfait dans cette situation. J'ai également utiliséCONCAT_WS
pour fusionner le nom et le SKU du