2014-10-31 132 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