情景:
我有一个应用程序,它有一个配置表,用于存储使用该应用程序的每个网站的配置数据。我在配置表中添加了几个额外的列,并将其滚动到所有应用程序。我已经使用所有配置表中需要相同的数据更新了这些新列。
我将如何做到这一点?
我的第一个想法是复制表并执行以下操作:
UPDATE `config` SET `config`.`new1` = `tmp_config`.`new1`, `config`.`new2` = `tmp_config`.`new2` LEFT JOIN `tmp_config` ON (`tmp_config`.`tmp_id` = `config`.`id`)
这是否会产生预期效果。
答案 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)
我不太了解你的所有问题。你在哪里改变了配置?我把你的解释读作:
有关多表更新的正确语法,请参阅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)。
我相信你说的是你要做的事。
您还可以执行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
应该做的伎俩(未经测试,没有保修; - ))