MYSQL从另一个表的字段更新多个字段

时间:2009-06-17 09:53:57

标签: mysql

情景:

我有一个应用程序,它有一个配置表,用于存储使用该应用程序的每个网站的配置数据。我在配置表中添加了几个额外的列,并将其滚动到所有应用程序。我已经使用所有配置表中需要相同的数据更新了这些新列。

我将如何做到这一点?

我的第一个想法是复制表并执行以下操作:

UPDATE `config` SET `config`.`new1` = `tmp_config`.`new1`, `config`.`new2` = `tmp_config`.`new2` LEFT JOIN `tmp_config` ON (`tmp_config`.`tmp_id` = `config`.`id`)

这是否会产生预期效果。

5 个答案:

答案 0 :(得分:8)

以下内容对我有用(使用INNER连接并将SET移动到查询的末尾:

UPDATE `config` INNER JOIN `tmp_config` ON (`tmp_config`.`id` = `config`.`id`) 
SET `config`.`new1` = `tmp_config`.`new1`, `config`.`new2` = `tmp_config`.`new2` 

感谢您的帮助!

答案 1 :(得分:3)

我不太了解你的所有问题。你在哪里改变了配置?我把你的解释读作:

  1. 您已更改所有应用程序的架构
  2. 您已在其他位置更新了应用程序的配置
  3. 有关多表更新的正确语法,请参阅VolkerK's答案。

    您使用的是哪个存储引擎?如果它是InnoDb(或支持事务的其他引擎),则应在运行查询之前启动事务。然后,您可以在提交任何更改之前验证结果是否为所需结果:

    示例:

      

    的MySQL>开始交易;

         

    的MySQL> SELECT * FROM Configs LIMIT 5; - 看看之前的样子

         

    的MySQL>在此处运行更新查询

         

    的MySQL> SELECT * FROM Configs LIMIT 5; - 验证结果是否为预期结果

         

    的MySQL> COMMIT;

答案 2 :(得分:2)

这应该会将config中的new1和new2更新为tmp_config中new1和new2的值,其中两个表中的id匹配(如果tmp_config中没有匹配则为null)。

我相信你说的是你要做的事。

来自MySql update reference

  

您还可以执行UPDATE操作   涵盖多个表格。但是,你   不能使用ORDER BY或LIMIT   多表更新。该   table_references子句列出了   参与联接的表。它的   语法在Section中描述   12.2.8.1,“JOIN语法”。这是一个例子:

     

更新项目,月份SET   items.price = month.price WHERE   items.id = month.id;

在这种情况下,它们不仅仅使用“JOIN”语法,但JOIN语法应该仍然有效,您只需要在SET子句之前执行它。

看起来像

UPDATE `config` 
  LEFT JOIN `tmp_config` ON (`tmp_config`.`tmp_id` = `config`.`id`)
  SET `config`.`new1` = `tmp_config`.`new1`, `config`.`new2` = `tmp_config`.`new2` 

答案 3 :(得分:1)

你需要这样做:

修改

CREATE TABLE newtable SELECT * FROM oldtable;

MySQL creates new columns for all elements in the SELECT. For example: 
mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT,
    ->        PRIMARY KEY (a), KEY(b))
    ->        TYPE=MyISAM SELECT b,c FROM test2;

答案 4 :(得分:1)

多表更新语法不允许您放置它的JOIN,请参阅http://dev.mysql.com/doc/refman/5.0/en/update.html

UPDATE 
  config, tmp_config
SET
  config.new1 = tmp_config.new1,
  config.new2 = tmp_config.new2
WHERE
  tmp_config.tmp_id = config.id
应该做的伎俩(未经测试,没有保修; - ))