21

我想更新随机选择的表中 50% 的行。有没有办法做到这一点?

编辑:只是为了澄清它应该始终更新 50% 的记录,但在这 50% 中,必须随机选择行(例如,不仅是前 50%)。换句话说,平均而言,应该更新所有其他记录。

4

4 回答 4

42

应该这样工作:

UPDATE table SET x = y WHERE RAND() < 0.5

是的,测试过,有效。但当然,平均只有 50% 的行,而不是 50%。

正如 SQL 92 规范中所写的,WHERE必须为每个元组执行该子句,因此rand()必须重新评估以产生预期的结果(而不是选择所有行或根本不选择行)。

规范摘录(强调我的):

一般规则

1)<search condition>应用于 T 的每一行。 的结果是 T 的结果为真的<where clause>那些 T 行的表。<search condition>

2)对 T 的每一<subquery><search condition> 有效地执行其中的每个,并将结果应用于T<search condition>的给定行。如果任何执行 <subquery>包含对 T 的列的外部引用,则引用是对的值T 的给定行中的该列。

于 2012-06-18T16:30:54.227 回答
7

正如我所说,这是一段很长的路,用一种伪代码来描述。)

$x = SELECT COUNT(*) FROM some_table;
@ids = SELECT id FROM some_table ORDER BY RAND() LIMIT $x / 2;
UPDATE some_table WHERE id IN (@ids);
于 2012-06-18T16:38:40.370 回答
0

UPDATE table SET volumnvalue = x WHERE RAND() <= 0.5 将导致非常接近 50% 的记录

于 2012-08-21T11:23:47.513 回答
0

RAND应该是随机的,你不会得到一个固定的百分位分割。

最好使用模运算符%来查找每 X 个项目。这对于像主键这样的唯一 id 列最有效。

尝试运行此查询,请务必指定您的表名和 id 列名:

选择每第二行,可被 2 整除 SELECT * from <your_table_name> where <id_column_name> %2=0

选择每 6 行,可被 6 整除 SELECT * from <your_table_name> where <id_column_name> %6=0

一旦您对SELECT结果看起来不错感到满意,您可以使用更新语法更改查询以更新记录,使用相同的WHERE子句

于 2016-11-24T05:03:58.760 回答