使用另一个的值更新一个MySQL表

Sup*_*gel 85 mysql sql

我正在尝试根据另一个MySQL的信息更新一个MySQL表.

我的original表看起来像:

id | value
------------
1  | hello
2  | fortune
3  | my
4  | old
5  | friend
Run Code Online (Sandbox Code Playgroud)

tobeupdated表如下所示:

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        |    | old
4        |    | friend
5        |    | fortune
Run Code Online (Sandbox Code Playgroud)

我想更新idtobeupdatedid来自original基于value(存储在字符串VARCHAR(32)字段).

更新的表有望看起来像:

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        | 4  | old
4        | 5  | friend
5        | 2  | fortune
Run Code Online (Sandbox Code Playgroud)

我有一个有效的查询,但它很慢:

UPDATE tobeupdated, original
SET tobeupdated.id = original.id
WHERE tobeupdated.value = original.value
Run Code Online (Sandbox Code Playgroud)

这最大化了我的CPU并最终导致超时,只执行了一小部分更新(有几千个值匹配).我知道匹配value将会很慢,但这是我必须将它们匹配在一起的唯一数据.

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

我试过MySQL - 如何使用另一个表中的值更新表?,但它并没有真正帮助.有任何想法吗?

在此先感谢帮助MySQL新手!

wir*_*d00 187

UPDATE tobeupdated
INNER JOIN original ON (tobeupdated.value = original.value)
SET tobeupdated.id = original.id
Run Code Online (Sandbox Code Playgroud)

应该这样做,而且它的确与你的完全一致.但是,我更喜欢连接的'JOIN'语法而不是多个'WHERE'条件,我认为它更容易阅读

至于跑步慢,桌子有多大?你应该有tobeupdated.value和索引original.value

编辑:我们也可以简化查询

UPDATE tobeupdated
INNER JOIN original USING (value)
SET tobeupdated.id = original.id
Run Code Online (Sandbox Code Playgroud)

USING是速记当联接两个表具有相同的命名keyid.即equi-join - http://en.wikipedia.org/wiki/Join_(SQL)#Equi-join

  • 多听啊:)我在这里也学到了很多东西.我非常喜欢这个网站,因为你可以接触到许多不同的问题和想法 (5认同)
  • 谢谢有线电视!这非常有效.这些表非常大(`原始`是100,000多个条目,'tobeupdated'10,000+),所以我接受了你和noodl关于索引的建议,整个查询现在在一秒钟内完成.我简直不敢相信!?非常感谢你的帮助; 我学到了很多东西! (3认同)