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


93

我正在尝试根据另一个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

我想更新idtobeupdatedid来自original基于value(存储在字符串VARCHAR(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-如何使用另一个表中的值更新表?,但并没有真正的帮助。有任何想法吗?

在此先感谢您帮助MySQL新手!


2
您的“值”列是否有索引?
noodl 2011年

嗨,noodl;不,value目前没有索引。
Superangel 2011年

Answers:


210
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

USING当联接的两个表都具有相同的名称(key例如)时,它是简写形式id。即一个等值联接-http: //en.wikipedia.org/wiki/Join_( SQL)#Equi-join


3
谢谢wired00!这很完美。这些表非常大(original有100,000多个条目和tobeupdated10,000 多个条目),因此我接受了您和noodl关于索引的建议,整个查询现在不到一秒钟就完成了。我不敢相信其中的区别!?非常感谢你的帮助; 我学到了很多东西!
Superangel 2011年

5
很高兴听到:)我在这里也学到很多。我非常喜欢这个网站,因为您可以接触到许多不同的问题和想法
Wire00 2011年

谢谢..我尝试了stackoverflow的很多操作..终于成功了
Jaxx0rr,2014年

只是想提一下,使用WHERE进行的简单UPDATE比JOIN语法快得多。约10.000行。
Alex2php

1
他们的关键成分当然是作为指标分配。我花了4秒钟来更新300K记录,而不是没有记录的超时。
Amjo

0

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


谢谢firegnom;我以前从未使用过触发器,但是我一定会继续阅读它们。
Superangel 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.