我有两张表:
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
答案 0 :(得分:2)
cities
表Set c.HasBeenUpdated = 1
添加到更新条款AND c.HasBeenUpdated IS NULL
WHERE
条件AND c.ID in (Select ID from Cities where HasBeenUpdated Is Null Limit 10000)
。这是必需的,因为您无法在多表Limit
(source)上使用Update
语句。这也假设你有一个ID列作为城市的PK(如果没有,那么考虑添加一个)。现在,update语句一次只处理10,000行(并且只处理未处理的行)。如果您可以使用应用程序逻辑将其置于循环中,则可以将其用于自动化。根据您的需要更改限制数量,完成后,删除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;