0

テーブルの各行を更新するためにストアド プロシージャで 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;
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();

すべての行に一意の番号ではなく、すべての行に定数番号を挿入するのはなぜですか?

4

2 に答える 2

4

while ステートメントは、反復ごとにテーブル全体の student_number の lesrand を設定します。各反復 (ループ内) の新しい乱数が必要で、変数 i で WHERE を使用して生徒を 1 人ずつ選択したい

このようなもの:

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;
于 2013-07-29T08:39:08.153 に答える
0

私はそれをテストしていませんが、lesrand は 1 回だけ割り当てられているようです。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))同じ結果になりませんか?

于 2013-07-29T08:40:12.560 に答える