Mysql用另一个表的值更新列

我有两张桌子,看起来都像

id  name  value
===================
1   Joe     22
2   Derk    30

我需要根据每个表中的检查名称将value的值从tableA复制到tableB

对于这个UPDATE语句有什么提示吗?

491547 次浏览

你需要连接这两个表:

例如,你想从tableA复制name的值到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

除了这个答案,如果你需要改变tableB。值根据表a。值可以动态执行,例如:

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 TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
);

如果你正在使用安全更新模式(并且你会得到一个错误,表明你已经尝试更新一个没有使用KEY列的WHERE表),第二种选择也是可行的,通过添加:

UPDATE TableB
SET TableB.value = (
SELECT TableA.value
FROM TableA
WHERE TableA.name = TableB.name
)
**where TableB.id < X**
;

如果你在两个表中都有相同的字段,那么很容易!....

table -1 =要更新的表。 table -2 = table where you from take data.

.
  1. 在表1中进行查询,找出共有字段值。
  2. 进行循环,根据表1的值找到表2中的所有数据。
  3. 再次在表1中进行更新查询。

$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();
}




}

将数据存储在临时表中

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    cities c,
city_langs cl
SET       c.fakename = cl.name
WHERE     c.id = cl.city_id