我有两张桌子,看起来都像
id name value
===================
1 Joe 22
2 Derk 30
我需要根据每个表中的检查名称将
value
的值从tableA
复制到tableB
。
对于这个
UPDATE
声明有什么建议吗?
除了这个答案之外,如果您需要根据 tableA.value 动态更改 tableB.value,您可以这样做:
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'
您需要连接两个表:
例如,您想要将
name
的值从 tableA 复制到 tableB
,其中它们具有相同的 ID
UPDATE tableB t1
INNER JOIN tableA t2
ON t1.id = t2.id
SET t1.name = t2.name
WHERE t2.name = 'Joe'
更新1
UPDATE tableB t1
INNER JOIN tableA t2
ON t1.id = t2.id
SET t1.name = t2.name
更新2
UPDATE tableB t1
INNER JOIN tableA t2
ON t1.name = t2.name
SET t1.value = t2.value
第二种可能性是,
UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
);
UPDATE cities c,
city_langs cl
SET c.fakename = cl.name
WHERE c.id = cl.city_id
如果您使用安全更新模式(并且您收到一条错误,表明您尝试更新没有使用 KEY 列的 WHERE 的表),则第二个选项也是可行的,方法是添加:
UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
)
**where TableB.id < X**
;
将数据存储在临时表中
Select * into tempTable from table1
现在更新专栏
UPDATE table1
SET table1.FileName = (select FileName from tempTable where tempTable.id = table1.ID);
就我而言,接受的解决方案太慢了。对于具有 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
我希望它能帮助将来的人,就像它帮助我一样
UPDATE tbl1
SET tbl1.columnName = (
SELECT tbl2.columnName
FROM tbl2
WHERE tbl2.id = tbl1.user_id
);
//WHERE tbl1.id = 7;