2014-10-31 131 views
0

有人可以運行一個健全性檢查以下查詢。我們正在嘗試更新數據庫,將25000個隨機用戶移動到新的測試電子郵件版本(將其emp_version更改爲「0.6.3」)。我們只想更改當前處於活動狀態1且當前emp_version爲「0.6.2」的用戶。MySQL健康檢查

UPDATE email_users 
SET emp_version="0.6.3" 
WHERE active = 1 
AND emp_version="0.6.2" 
ORDER BY rand() LIMIT 25000; 
+0

請讓我知道確切的錯誤你在查詢中所面臨的語法看起來相當不錯。 – 2014-10-31 07:28:14

+0

沒有錯誤,它只是一個健全的檢查,以確保我不會搞砸生產數據庫。 – user2694306 2014-10-31 10:16:04

+0

不要我的,但你的代碼是完全正常:) – 2014-11-01 06:01:36

回答

2

單表更新

您可以使用ORDER BY和限制。 檢查http://dev.mysql.com/doc/refman/5.7/en/update.html

UPDATE email_users 
SET emp_version="0.6.3" 
WHERE active = 1 
AND emp_version="0.6.2" 
ORDER BY rand() LIMIT 25000; 

多表更新(使用INNER JOIN)

在多表更新的情況下,一個不能使用ORDER BY,LIMIT更新詢問,以便使用它們,我們使用子查詢獲得25000個所需的元組,然後用同一個表進行INNER JOIN。我們無法更新子查詢表,因爲它實際上不存在於數據庫中。

下面的查詢嘗試

UPDATE email_users eu INNER JOIN 
     (SELECT * FROM email_users 
     WHERE emp_version="0.6.2" 
     AND active = 1 
     ORDER BY rand() 
     LIMIT 25000) AS neu 
SET eu.emp_version="0.6.3" 
WHERE eu.id = neu.id 
+0

它應該讀取WHERE emp_version =「0.6.2」,但否則它的工作很好。謝謝! – user2694306 2014-10-31 07:07:12

+0

抱歉我的不好,現在糾正:) – 2014-10-31 07:08:05

+0

我看不到這個查詢比原來的優勢。我錯過了什麼嗎? – Strawberry 2014-10-31 07:46:32