2009-06-17 190 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;

相關問題