2013-07-29 47 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

白癡可能有點極端。一切順利,哥們 –