首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要更新包含数百万行的MySQL表

问需要更新包含数百万行的MySQL表
EN

Stack Overflow用户
提问于 2011-05-19 14:25:14
回答 2查看 4.1K关注 0票数 2

我有两张桌子:

代码语言:javascript
复制
Cities
Region| City Name 

States
ID| State | Region_Key

我需要在cities表上执行一个更新查询,比如设置cities.region = statres.id where states.region_key = cities.region

问题是,cities数据库有超过270万条记录,我尝试执行这样的查询,结果mysql挂起并消失。

代码语言:javascript
复制
update cities c, states c set c.region = s.id where c.region = s.region_key

编辑===================

这是我正在使用的sql,但它不起作用,我得到一个错误,指出UPDATE和LIMIT的用法不正确

代码语言:javascript
复制
update cities w, states s 
set w.region_id = s.id, 
w.updated = 1 
where w.region = s.w_code and w.updated = 0
LIMIT 10000
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-19 14:30:08

  1. 将可空的位列HasBeenUpdated添加到cities表
  2. 将Set c.HasBeenUpdated = 1添加到update子句
  3. 添加以下where条件AND c.HasBeenUpdated IS NULL
  4. Add a new代码条件<cities>d12WHERE >。这是必需的,因为您不能在多表Update (source)上使用Limit语句。这还假设您有一个ID列作为城市的PK (如果没有,请考虑添加一个)。现在,update语句一次只处理10,000行(并且只处理未处理的行)。

如果您可以使用您的应用程序逻辑将其放入循环中,则可以将其用于自动化。根据需要更改限制数量,完成后,删除HasBeenUpdated列。

这应该允许您最小化更新对表和数据库的影响,并允许您以可管理的批处理方式在整个表中执行更新。

编辑:Update步骤4通过子查询筛选要更新的行,因为Limit语句不能用于多表更新。

票数 2
EN

Stack Overflow用户

发布于 2011-05-19 16:37:05

使用SELECT INTO NEW_TABLE创建一个包含所需内容的新表,然后删除/重命名旧表,并使用RENAME TABLE将新创建的表重命名为正确的名称:

代码语言:javascript
复制
CREATE TABLE new_cities SELECT 
   states.id AS region_id, cities.name 
FROM cities JOIN states ON cities.region = states.w_code;

RENAME TABLE cities TO old_cities, new_cities TO cities;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6054643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档