我正在尝试根据另一个人的信息更新一个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
我想根据id
(tobeupdated
字段中存储的字符串)使用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新手!
答案 0 :(得分:182)
UPDATE tobeupdated
INNER JOIN original ON (tobeupdated.value = original.value)
SET tobeupdated.id = original.id
应该这样做,而且它的确与你的完全一致。但是,我更喜欢连接的'JOIN'语法,而不是多个'WHERE'条件,我认为它更容易阅读
至于跑步速度慢,桌子有多大?您应该在tobeupdated.value
和original.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)
这取决于这些表的用途,但您可以考虑在插入和更新时将触发器放在原始表上。插入或更新完成后,仅基于原始表中的一个项目更新第二个表。它会更快。