2011-05-19 73 views
2

我有两个表希尔的更新MySQL表:需要数以百万计的行

Cities 
Region| City Name 

States 
ID| State | Region_Key 

我需要在城市表做一个更新查询,像这样即设置cities.region = statres.id其中状态.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 
+1

分解成批次,可能使用另一列(如日期时间),或者如果不适合引入row_number() – 2011-05-19 06:28:48

+0

您使用别名“c”两次,对于每个表 – bart 2011-05-19 11:15:47

回答

2
  1. 添加可为空的位柱[HasBeenUpdated]将cities
  2. 添加Set c.HasBeenUpdated = 1到更新子句
  3. 在条件下添加以下条件AND c.HasBeenUpdated IS NULL
  4. 添加新的WHERE条件AND c.ID in (Select ID from Cities where HasBeenUpdated Is Null Limit 10000)。这是必需的,因为您不能在多表Updatesource)上使用Limit语句。这也假定你有一个ID列作为城市的PK(如果没有,则考虑加一个)。现在,update语句一次只能处理10,000行(并且只处理未处理的行)。

如果你可以把这个使用你的应用程序逻辑的循环,那么这可以用于自动化。根据您的需求更改限制数量,并在完成后删除HasBeenUpdated列。

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

编辑:更新步骤4以筛选要通过子查询更新的行,

+0

,您的意思是'WHERE c.hasBeenUpdated IS NULL',当然? – Piskvor 2011-05-19 06:47:50

+0

不工作:(我得到一个erorr说错误的更新和限制使用,我在这里使用两个表 – Ali 2011-05-19 07:04:19

+0

请检查我更新的问题... – Ali 2011-05-19 07:05:26

1

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

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;