281

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

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

我需要根据每个表中的检查名称复制from的value值。tableAtableB

UPDATE这个声明有什么提示吗?

4

8 回答 8

530

除了这个答案,如果您需要根据 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'
于 2013-10-13T14:35:38.330 回答
187

你需要加入这两个表:

例如,您想将nametableA 的值复制到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
于 2012-07-29T12:02:23.390 回答
111

第二种可能是,

UPDATE TableB 
SET TableB.value = (
    SELECT TableA.value 
    FROM TableA
    WHERE TableA.name = TableB.name
);
于 2014-04-11T22:08:52.753 回答
11
    UPDATE    cities c,
          city_langs cl
    SET       c.fakename = cl.name
   WHERE     c.id = cl.city_id
于 2019-10-04T15:40:49.743 回答
3

如果您使用的是安全更新模式,则第二个选项也是可行的(并且您收到一条错误消息,表明您尝试更新没有使用 KEY 列的 WHERE 的表),方法是添加:

UPDATE TableB  
SET TableB.value = (  
SELECT TableA.value  
    FROM TableA  
    WHERE TableA.name = TableB.name  
)  
**where TableB.id < X**  
;
于 2017-02-07T10:06:59.543 回答
2

将数据存储在临时表中

Select * into tempTable from table1

现在更新列

 UPDATE table1
    SET table1.FileName = (select FileName from tempTable where tempTable.id = table1.ID);
于 2018-05-15T14:12:42.807 回答
0

就我而言,接受的解决方案太慢了。对于具有 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

我希望它会帮助将来像它帮助我一样的人

于 2019-05-02T22:47:45.527 回答
-8

如果您在两个表中都有共同字段,那么这很容易!.....

表 1 = 要更新的表。表 2 = 您从中获取数据的表。

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


}
于 2017-06-14T07:24:51.163 回答