我正在尝试根据来自另一个表的信息来更新一个MySQL表。
我的original表如下所示:
id | value
------------
1 | hello
2 | fortune
3 | my
4 | old
5 | friendtobeupdated表如下所示:
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新手的帮助!
发布于 2011-04-20 20:41:14
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当连接的两个表具有相同的命名key时,USING是速记形式,例如id。即一个等值加入http://en.wikipedia.org/wiki/Join_(SQL)#Equi-join
发布于 2011-04-20 17:49:01
这取决于这些表的用途,但您可以考虑在插入和更新时将触发器放在原始表上。插入或更新完成后,仅基于原始表中的一项更新第二个表。这样会更快。
https://stackoverflow.com/questions/5727827
复制相似问题