2009-06-17 195 views
2

场景: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`)

这是否具有所期望的影响。

回答

7

以下为我工作(使用INNER JOIN和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

你需要做的,如:

编辑

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; 
+0

-1不工作,不存在 – 2009-06-17 10:07:45

+0

我已经创建了保存表,它将数据获取到现有表中,这是问题 – Lizard 2009-06-17 10:09:03

+0

+1答案已更正 – 2009-06-17 10:10:18

2

这应该在配置更新和名new1 NEW2到new1和NEW2的tmp_config在以往任何时候来自这两个表匹配的IDS(和空如果在tmp_config不匹配)的值的影响。

我相信这就是你说你正在尝试做的。

MySql update reference

您还可以执行UPDATE操作 覆盖多个表。但是,您 不能使用ORDER BY或LIMIT与 多表UPDATE。 table_references子句列出了参与连接的 表。其 语法在第 12.2.8.1节“JOIN语法”中描述。下面是一个例子:

UPDATE items,month 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` 
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
应该做的伎俩(未经测试,不保证;-))

3

我不完全理解你所有的问题。你在哪里改变了配置?我看了你的解释为:

  1. 更改了方案适用于所有应用
  2. 您已更新了应用程序的配置在其他地方

VolkerK's答案的正确语法多表更新。

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

实施例:

的MySQL> START TRANSACTION;

mysql> SELECT * FROM Configs LIMIT 5; - 看看它看起来像以前一样

的mysql>运行更新这里查询

的mysql> SELECT * FROM CONFIGS LIMIT 5; - 确认结果是预期结果

mysql> COMMIT;

相关问题