我有两张桌子,看起来都像
id name value
===================
1 Joe 22
2 Derk 30
我需要根据每个表中的检查名称将值的值从tableA复制到tableB。
对于这个UPDATE语句有什么建议吗?
我有两张桌子,看起来都像
id name value
===================
1 Joe 22
2 Derk 30
我需要根据每个表中的检查名称将值的值从tableA复制到tableB。
对于这个UPDATE语句有什么建议吗?
当前回答
第二种可能是,
UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
);
其他回答
在我的案例中,公认的解决方案太慢了。对于一个有180K行的表,更新速度大约是每秒10行。这是连接元素上的索引。
我最终用一个程序解决了我的问题:
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
我希望它将来能帮助别人,就像它帮助了我一样
将数据存储在临时表中
Select * into tempTable from table1
现在更新列
UPDATE table1
SET table1.FileName = (select FileName from tempTable where tempTable.id = table1.ID);
如果你正在使用安全更新模式(并且你会得到一个错误,表明你已经尝试更新一个没有使用KEY列的WHERE表),第二种选择也是可行的,通过添加:
UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
)
**where TableB.id < X**
;
UPDATE cities c,
city_langs cl
SET c.fakename = cl.name
WHERE c.id = cl.city_id
第二种可能是,
UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
);