用另一个值更新一个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 

我想更新idoriginal基于value (string存储在VARCHAR(32)字段)的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 

这最大限度地减less了我的CPU,并最终导致只有一小部分更新执行超时(有几千个值匹配)。 我知道按value匹配将是缓慢的,但这是唯一的数据,我必须匹配在一起。

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

我试过MySQL – 我怎样才能更新另一个表中的值的表? ,但它并没有真正的帮助。 有任何想法吗?

预先感谢帮助MySQL新手!

 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 (如id时,可以使用USING作为简写。 ie equi-join – http://en.wikipedia.org/wiki/Join_(SQL)#Equi-join

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

你可以试试这个

 UPDATE tobeupdated SET id = (SELECT original.id FROM original WHERE tobeupdated.value = original.value LIMIT 1)