MySQL使用子查询进行更新

28

我有一张表,暂称之为table1,其中两列的数据已经被破坏了。

幸运的是,我有一份旧的备份表。

在旧的备份表中,涉及这两个列的值是正确的,但其他列的值已经过时,因此我不能简单地导入整个备份文件。

所以我将其导入另一张表,称为table2。每条记录都有一个相同的id在两个表中。

因此,基本上我需要一条查询语句,可以遍历table1中的每条记录,并使用来自table2对应的值更新column1和column2。


为什么不在table1中创建两列,并从table2的相应列导入数据呢? - Mithun Sreedharan
3个回答

56

原始表是table1,备份表是table2。

UPDATE table1 t1 JOIN table2 t2 ON t1.id = t2.id
SET t1.col1 = t2.col1, t1.col2 = t2.col2, ...

这是正确的做法。多表更新可以非常有用。http://dev.mysql.com/doc/refman/5.1/en/update.html - user213154

25
这将适用于所有类型的SQL数据库:
update table1 t set
column1 = (select column1 from old_table where id = t.id),
column2 = (select column2 from old_table where id = t.id);

不需要任何特殊/聚合函数,因为ID匹配将精确命中一行。


如果您想要使用完全不同的表结构进行工作,那么最好提供更好的答案。 - Soullivaneuh
1
错误代码:1093。您无法在FROM子句中更新目标表“t”。 - Murilo
1
@Murilo 你可以在FROM子句中指定要更新的表t:请参见演示 - Bohemian
是的,在我的查询中发现我也引用了表中的t,但mysql不允许这样做,但是通过创建一个临时表找到了解决方法,这真的非常有帮助。 - Murilo
错误1093表示正在更新的同一张表中存在子查询。上述问题针对两个不同的表,尽管有些人可能会在谷歌搜索自引用更新的语法时到达此处。 - dataless

0

我认为你可以尝试这样做:

UPDATE table1 SET table1field = (SELECT MAX(table2.table2field) FROM table2 WHERE table1.table1field = table2.table2field)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接