2011-04-20 85 views
80

我试图根据另一个表格的信息更新一个MySQL表格。用另一个值更新一个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 

我想tobeupdatedidoriginal基于存储在value(字符串更新idVARCHAR(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

您的'价值'栏是否有索引? – noodl 2011-04-20 09:23:14

+0

嗨noodl;不,“价值”目前没有索引。 – Superangel 2011-04-20 09:37:29

回答

164
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是速记时联接两个表具有相同的命名keyid。 ie equi-join - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-join

+3

Thanks wired00!这工作完美。这些表格非常大(“原始”是100,000+条目,而“更新”是10,000+),所以我采纳了你和noodl关于索引的建议,现在整个查询在一秒钟内完成。我不相信有什么区别!?非常感谢你的帮助;我学到了很多东西! – Superangel 2011-04-20 13:47:00

+5

这听起来很棒:)我在这里也学到了很多东西。我真的很喜欢这个网站,因为你可以接触到许多不同的问题和想法 – wired00 2011-04-20 13:49:59

+0

谢谢..我尝试了很多东西从stackoverflow ..这一个终于工作 – 2014-05-05 09:11:33

0

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

+0

感谢firegnom;我从来没有使用过触发器,但我一定会读到它们。 – Superangel 2011-04-20 13:47:57