更新具有不同随机数的表列

时间:2013-08-09 10:02:41

标签: sql sqlite

我有这个查询

UPDATE f1
SET col = (SELECT ABS(300 + RANDOM() % 3600))

使用300到3600之间的随机数更新“col”列。 但它为所有行返回相同的随机数。有没有办法用不同的随机数更新行?

4 个答案:

答案 0 :(得分:8)

它使用相同的随机数,因为子查询只需要为UPDATE运行一次。换句话说,SQL引擎知道内部SELECT只需要为查询运行一次;它会这样做,并使用每行的结果值。

您实际上不需要子查询。这将做你想要的:

UPDATE f1
SET col = ABS(300 + RANDOM() % 3600);

但是如果由于某种原因你真的想要一个子查询,你只需要确保它依赖于正在更新的表中的行。例如:

UPDATE f1
SET col = (SELECT (col*0) + ABS(300 + RANDOM() % 3600));

答案 1 :(得分:0)

我建议添加一个WHERE子句,在该子句中使用属性来区分行。 例如,假设您有一个row_id列,并且您只想更新row_id中包含1的行,那么您使用的代码将类似于:

UPDATE f1
SET col = (SELECT ABS(300 + RANDOM() % 3600))
WHERE row_id = 1

结果表格如下:

row_id    |   col     |
   1      |   200     |

“col”列中的值对应于随机数。

答案 2 :(得分:0)

你也可以在oracle数据库中尝试这个对我有用的东西。 例如,如果您想使用RPAD获得四位数的随机数,请使用下面的查询:

Update tableName set ColName=RPAD(round(dbms_random.value(0,9999)),4,'0');

答案 3 :(得分:-1)

您可以尝试通过编写SQL过程来解决问题,如下所示:

DELIMITER $$
CREATE PROCEDURE proc_name()
BEGIN
    DECLARE c int ;
    SET c = 1 ;
    WHILE c< (SELECT MAX(row_id) FROM f1) DO
      UPDATE f1 
        SET col = SELECT ABS(300 + RANDOM() % 3600)
        WHERE row_id = c;
      SET c = c + 1 ;
    END WHILE ;
END $$
DELIMITER ;