使用随机数更新表行失败

时间:2013-07-29 08:34:14

标签: mysql

我在存储过程中使用while循环来更新表的每一行,但更新值对于所有行保持不变。例如,在我的表中,所有行的生成数字是2266而不是唯一的数字

我的存储过程如下所示

DELIMITER ;;
CREATE PROCEDURE lesrows()
BEGIN
DECLARE n INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
DECLARE lesrand INT DEFAULT 0;
SELECT COUNT(*) FROM students INTO n;
select(FLOOR(2000 + RAND() * (3000 - 2000) )) into lesrand;
SET i=0;
WHILE i<n DO 
  UPDATE students set student_number= lesrand;
  SET i = i + 1;
END WHILE;
End;
;;

call lesrows();

为什么它为所有行插入一个常数而不是每行都有一个唯一的数字?

2 个答案:

答案 0 :(得分:4)

while语句在每次迭代时将整个表的student_number设置为lesrand。你想要每个迭代的一个新的随机数(在循环内),你想要使用WHERE和变量i一个一个地选择学生

这样的事情:

SET i=0;
WHILE i<n DO 
select(FLOOR(2000 + RAND() * (3000 - 2000) )) into lesrand;      
UPDATE students set student_number= lesrand WHERE student_ID = i;
SET i = i + 1;
END WHILE;

答案 1 :(得分:0)

我还没有测试过,但看起来lesrand只分配了一次。您是否尝试将select(FLOOR(2000 + RAND() * (3000 - 2000) )) into lesrand;移动到while循环中,如下所示:

DELIMITER ;;
CREATE PROCEDURE lesrows()
BEGIN
DECLARE n INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
DECLARE lesrand INT DEFAULT 0;
SELECT COUNT(*) FROM students INTO n;
SET i=0;
WHILE i<n DO 
  select(FLOOR(2000 + RAND() * (3000 - 2000) )) into lesrand;
  UPDATE students set student_number= lesrand;
  SET i = i + 1;
END WHILE;
End;
;;

call lesrows();

为什么使用存储过程? UPDATE students SET student_number = FLOOR(2000 + RAND() * (3000 - 2000))不会有相同的结果吗?