mysql更新列,其中包含来自另一个表的值

时间:2012-07-29 11:54:05

标签: mysql sql sql-update

我有两张桌子,看起来像

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

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

UPDATE声明的任何提示?

8 个答案:

答案 0 :(得分:343)

除了这个答案之外,如果你需要动态地根据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'

答案 1 :(得分:139)

你需要加入这两个表:

例如,您希望将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

答案 2 :(得分:77)

第二种可能性是,

UPDATE TableB 
SET TableB.value = (
    SELECT TableA.value 
    FROM TableA
    WHERE TableA.name = TableB.name
);

答案 3 :(得分:3)

如果您使用的是安全更新模式,那么第二个选项也是可行的(并且您收到的错误表明您已经尝试更新没有使用KEY列的WHERE的表) ,添加:

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

答案 4 :(得分:1)

    UPDATE    cities c,
          city_langs cl
    SET       c.fakename = cl.name
   WHERE     c.id = cl.city_id

答案 5 :(得分:0)

将数据存储在临时表

Select * into tempTable from table1

现在更新专栏

 UPDATE table1
    SET table1.FileName = (select FileName from tempTable where tempTable.id = table1.ID);

答案 6 :(得分:0)

就我而言,公认的解决方案太慢了。对于具有18万行的表,更新速率约为每秒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

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

答案 7 :(得分:-3)

如果你在两个表中都有共同的字段,那就太容易了!....

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

  1. 在表-1中进行查询并查找公共字段值。
  2. 根据表1值进行循环并从表-2中查找所有数据。
  3. 再次在表1中进行更新查询。
  4. $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();
        }
    
    
    }