2013-07-29 18 views
0

我在存储过程中使用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

while语句在每次迭代中设置整个表的student_number为lesrand。你需要每个迭代的新随机数(循环内),并且你想用你的变量i使用WHERE逐个选择学生。 –

+0

我想每个迭代都有一个新的随机数。 –

+0

@danihp我已经完成了。 –

回答

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; 
+0

仍然与您的建议'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; 当选择(FLOOR(2000 + RAND()*(3000-2000)))至lesrand; 更新学生设置student_number = lesrand WHERE student_ID = i; SET i = i + 1; END WHILE; 结束' –

+0

well student_ID是在你的餐桌设计猜测。主要关键是什么?你需要使用我以某种方式迭代学生(即以某种方式将我映射到主键)。另外还有一个问题 - 为什么(3000-2000)?为什么不是1000? –

+0

我看到了,很好;) – danihp

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))会不会有相同的结果?

+2

这将仍然将整个表的student_number设置为每次迭代时的随机数。所以最后一个随机数将被分配给他们。 –

+0

是的,@ d'alar'cop,我是个白痴! :-) –

+0

白痴可能有点极端。一切顺利,哥们 –