我试图根据另一个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

我想根据value(存储在VARCHAR(32)字段中的字符串)将tobeupdated中的id更新为original中的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?次,但都没用.有什么 idea 吗?

提前感谢您对MySQL新手的帮助!

推荐答案

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

这应该可以做到,而且实际上它正是在做你的事情.然而,我更喜欢连接的"连接"语法,而不是多个"WHERE"条件,我认为它更容易阅读

至于跑得慢,桌子有多大?你应该在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英镑

Mysql相关问答推荐

试图加快查询速度-没有使用索引?

将具有多个结果的表连接为新列?

MySQL在带有特定属性值上的对象的数组的杨森对象中搜索

客户跨订阅的跨时间线计数

在MySQL的join查询中进行计算

避免多个SQL查询的重构代码

状态为已发货的订单返回产品总数量的SQL(不同的两张表)

Mysql,显示谁已经和没有 Select 退出巴士服务

MySQL - 单词边界的正则表达式,不包括下划线(连接标点符号)

此更新查询是否有任何可能的重写选项?

处理 Visits 表中数百万行的最佳方法是什么?

是否可以在一个查询中将字符串附加到许多匹配的行

如果在表中多次发现 a 列中的相同值,则排除所有行

你如何 OR 两个 LIKE 语句?

MySQL:按字段排序,将空单元格放在末尾

Mysql中int(10)的最大大小是多少

如何让mysql自动启动? (仅限 linux-cli)

MySQL术语约束与外键的区别?

当运行 UPDATE ... datetime = NOW();所有更新的行都会有相同的日期/时间吗?

匹配 IN 子句中的所有值