I have two tables, both looking like
id name value
===================
1 Joe 22
2 Derk 30
I need to copy the value of value from tableA to tableB based on check name in each table.
Any tips for this UPDATE statement?
In addition to this answer if you need to change tableB.value according to tableA.value dynamically you can do for example:
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'
INNER JOIN is perfect in this situation. I also used CONCAT_WS to merge pruduct name and SKU from another tableUPDATE 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.nameINNER JOIN is joining on name and your WHERE is looking for TableA.name. The JOIN won't happen, since there's no records to join on, and therefore you can't update TableB where the name is Joe, because there aren't any records matching that criteria.you need to join the two tables:
for instance you want to copy the value of name from tableA into tableB where they have the same ID
UPDATE tableB t1
INNER JOIN tableA t2
ON t1.id = t2.id
SET t1.name = t2.name
WHERE t2.name = 'Joe'
UPDATE 1
UPDATE tableB t1
INNER JOIN tableA t2
ON t1.id = t2.id
SET t1.name = t2.name
UPDATE 2
UPDATE tableB t1
INNER JOIN tableA t2
ON t1.name = t2.name
SET t1.value = t2.value
where clause or modify the where clause depending on your needs..Second possibility is,
UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
);
.name is indexed on both tables?UPDATE cities c, city_langs cl
SET c.fakename = cl.name
WHERE c.id = cl.city_id
The second option is feasible also if you're using safe updates mode (and you're getting an error indicating that you've tried to update a table without a WHERE that uses a KEY column), by adding:
UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
)
**where TableB.id < X**
;
In my case, the accepted solution was just too slow. For a table with 180K rows the rate of updates was about 10 rows per second. This is with the indexes on the join elements.
I finally resolved my issue using a procedure:
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
I hope it will help someone in the future like it helped me
This code work fine for me:
mysql> update link_productgroepen set groep_id=(select groep_id from link_productgroepen_bck where link_productgroepen.sku=link_productgroepen_bck.sku);
link_productgroepen_bck contains a backup of the table link_productgroepen ,so the structure is the same. In order to update the link_productgroepen table I need to drop it and to create a new empty clone of it that gets filled with the new values provided by an other website by an api. This new dataset needs to be complemented by information present in 2 columns in the link_productgroepen_bck table. The code above copies the contents of the groep_id column in the link_productgroepen_bck table to the renewed ink_productgroepen table if the sku value in both tables is the same. The other backupped column is copied by the same mysql command but with the other column name.