首页 文章

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

提问于
浏览 1104
83

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

我想根据 valueVARCHAR(32) 字段中存储的字符串)使用 idtobeupdated 更新 id 中的 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

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

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

我试过MySQL - How can I update a table with values from another table?,但它并没有真正帮助 . 有任何想法吗?

在此先感谢帮助MySQL新手!

2 回答

  • 180

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

  • 0
    UPDATE tobeupdated
    INNER JOIN original ON (tobeupdated.value = original.value)
    SET tobeupdated.id = original.id
    

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

    至于跑步慢, table 有多大?您应该在 tobeupdated.valueoriginal.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

相关问题