用另一个 MySQL 表的值更新一个 MySQL 表

Posted

技术标签:

【中文标题】用另一个 MySQL 表的值更新一个 MySQL 表【英文标题】:Update one MySQL table with values from another 【发布时间】:2011-04-20 08:57:14 【问题描述】:

我正在尝试根据另一个 mysql 表的信息更新一个表。

我的original 表如下:

id | value
------------
1  | hello
2  | fortune
3  | my
4  | old
5  | friend

tobeupdated 表看起来像:

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        |    | old
4        |    | friend
5        |    | fortune

我想根据value(存储在VARCHAR(32)字段中的字符串)使用original中的id更新tobeupdated中的id

希望更新后的表格如下所示:

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        | 4  | old
4        | 5  | friend
5        | 2  | fortune

我有一个有效的查询,但速度很慢:

UPDATE tobeupdated, original
SET tobeupdated.id = original.id
WHERE tobeupdated.value = original.value

这会耗尽我的 CPU 并最终导致仅执行一小部分更新的超时(有数千个值要匹配)。我知道value 匹配会很慢,但这是我必须将它们匹配在一起的唯一数据。

有没有更好的方法来更新这样的值?我可以为合并的结果创建第三个表,如果这样会更快?

我尝试了MySQL - How can I update a table with values from another table?,但并没有真正帮助。有什么想法吗?

提前感谢您帮助 MySQL 新手!

【问题讨论】:

你的“价值”列有索引吗? 你好面条;不,value 目前没有索引。 【参考方案1】:
UPDATE tobeupdated
INNER JOIN original ON (tobeupdated.value = original.value)
SET tobeupdated.id = original.id

应该这样做,而且它确实在做你的事情。但是,我更喜欢连接的 'JOIN' 语法而不是多个 'WHERE' 条件,我认为它更容易阅读

至于运行缓慢,表有多大?您应该在 tobeupdated.valueoriginal.value 上有索引

编辑: 我们还可以简化查询

UPDATE tobeupdated
INNER JOIN original USING (value)
SET tobeupdated.id = original.id

USING 是当连接的两个表具有相同的名称 key(例如 id)时的简写。即 equi-join - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-join

【讨论】:

感谢wired00!这完美地工作。这些表非常大(original 有 100,000+ 个条目,tobeupdated10,000+),所以我采纳了您和 noodl 关于索引的建议,整个查询现在在一秒钟内完成。我无法相信差异!?非常感谢你的帮助;我学到了很多东西! 很高兴听到 :) 我在这里也学到了很多东西。我真的很喜欢这个网站,因为您可以接触到许多不同的问题和想法 谢谢..我从***尝试了很多东西..这个终于奏效了 只想提一下,使用 WHERE 的简单 UPDATE 比 JOIN 语法快得多。大约 10.000 行。 它们的关键成分当然是指定为索引。带我在 4 秒内更新 30 万条记录,而不是没有它们的超时。【参考方案2】:

这取决于这些表的用途,但您可以考虑在插入和更新时将触发器放在原始表上。插入或更新完成后,仅根据原始表中的一项更新第二个表。会更快。

【讨论】:

感谢 firegnom;我以前从未使用过触发器,但我一定会仔细阅读它们。

以上是关于用另一个 MySQL 表的值更新一个 MySQL 表的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 用另一个表的值更新一个表 - 我可以在 bigquery 中使用它吗?

Mysql:用另一个表的选择最大值更新表[重复]

MYSQL:我想用另一个表中的值更新表中的所有行,其中第一个表中的值等于第二个表

用另一个表的值更新表

用另一个查询的随机值更新mysql表?

MySQL用另一张表的字段值Update本表