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

时间:2011-04-20 08:57:14

标签: mysql sql

我正在尝试根据另一个人的信息更新一个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

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

更新后的表格有望如下:

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新手!

2 个答案:

答案 0 :(得分:182)

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是简写。即等于加入 - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-join

答案 1 :(得分:0)

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