用另一个值更新一个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
我想更新id
与original
基于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)