需要使用数百万行更新MySQL表

时间:2011-05-19 06:25:14

标签: mysql sql

我有两张表:

Cities
Region| City Name 

States
ID| State | Region_Key

我需要对城市表进行更新查询,例如设置cities.region = statres.id where states.region_key = cities.region

问题是,城市数据库有超过270万条记录,我尝试这样的查询只是为了让mysql挂起并消亡。

update cities c, states c set c.region = s.id where c.region = s.region_key

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

这是我正在使用的sql,但它不起作用我收到错误说错误使用UPDATE和LIMIT

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

2 个答案:

答案 0 :(得分:2)

  1. 将可空位列[HasBeenUpdated]添加到cities
  2. Set c.HasBeenUpdated = 1添加到更新条款
  3. 在条件AND c.HasBeenUpdated IS NULL
  4. 中添加以下内容
  5. 添加新的WHERE条件AND c.ID in (Select ID from Cities where HasBeenUpdated Is Null Limit 10000)。这是必需的,因为您无法在多表Limitsource)上使用Update语句。这也假设你有一个ID列作为城市的PK(如果没有,那么考虑添加一个)。现在,update语句一次只处理10,000行(并且只处理未处理的行)。
  6. 如果您可以使用应用程序逻辑将其置于循环中,则可以将其用于自动化。根据您的需要更改限制数量,完成后,删除HasBeenUpdated列。

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

    编辑:更新步骤4以过滤要通过子查询更新的行,因为不能在多表更新上使用Limit语句。

答案 1 :(得分:1)

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

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;