我在存储过程中使用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();
为什么它为所有行插入一个常数而不是每行都有一个唯一的数字?
答案 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))
不会有相同的结果吗?