MySQL更新列与另一个表中的值


221

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

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

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

这个UPDATE说法有什么建议吗?

Answers:


412

除了此答案之外,如果您需要根据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'

是的,INNER JOIN在这种情况下是完美的。我还曾经CONCAT_WS合并过另一个表的产品名称和SKU
vladkras 2014年

2
有办法使用别名吗?
Gellie Ann

我尝试了一下,但没有成功,因为“受影响的行”数使我得到5690,但是总行数是59643,为什么?这是查询:UPDATE participants_registrations INNER JOIN participants ON participants.id = participants_registrations.participantId INNER JOIN registrations ON registrations.id = participants_registrations.registrationId LEFT JOIN groups ON (groups.id = registrations.groupId) SET registrations.groupId = groups.id, registrations.groupName = groups.name, participants.memberOfGroupName = groups.name
Great Sphinx

这行不通。tableB仍具有自己的数据,并且没有变化。wtools.io/paste-code/bzWA基于OP和此答案的示例。
sniffingdoggo

157

您需要加入两个表:

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

1
香港专业教育学院在1K记录以不同的名称和价值,在这里你说只是为了记录1
LeoSam

你可以删除where条款或修改where根据您的需要..节
吴宇森

表B的记录也比表A多,我的想法是从表B到a,如果名称存在,将“ value”的值复制到表B,!
LeoSam

我不知道我是否清楚地理解了您的问题,您可以检查我的最新答案吗?
吴宇森

我确实尝试过两次更新,第二次更新说对734行有效,我检查了所有值仍未更改为0
LeoSam

91

第二种可能性是

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

7
是的,我们只需要用另一个表中的值更新一个字段,就不需要复杂的联接。
davidkonrad,2015年

8
是的,这很好,但是在大型数据集上非常慢。如果您正在使用小型表,则此方法很好,但是我建议使用上面所示的JOIN来进行其他操作。
frijj2k 2015年

同样,在这种情况下,由于SQL约束,表A和B不能是同一张表。
Muhwu

@ frijj2k如果.name在两个表上都建立索引,这仍然会很慢吗?
Steverino'1

3

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

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

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


0

就我而言,公认的解决方案太慢了。对于具有18万行的表,更新速率约为每秒10行。这是与join元素上的索引一起使用的。

我终于使用以下过程解决了我的问题:

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

我希望它能像我一样对以后的人有所帮助


-4

如果两个表中都有公共字段,那就太简单了!....

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


}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.