2011-05-19 112 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;