사이트 내 검색:

MySQL random 값 생성

05 Mar 2014

안내

본 문서는 블로그의 운영자인 본인이 Stackoverflow에 올린 답변을 정리한 글입니다.

Stackoverflow URL

http://stackoverflow.com/questions/20288286/update-records-with-random-number/20288337

질문

20만개의 레코드를 가진 비디오 테이블(videos)이 존재한다. 각 비디오 레코드의 조회수 (views) 컬럼의 값을 1에서 10,000 사이의 랜덤 값으로 설정하려고 한다. 다음과 같이 시도했었는데 잘 안 된다.

답변

MySQL의 RAND() 함수는 PHP처럼 MIN, MAX의 값을 인자로 줄 수는 없다. RAND() 함수는 0에서 1 사이의 랜덤 값을 생성하기만 한다. 다음과 같이 RAND()의 결과를 1 ~ 10,000 사이의 값으로 변경하면 된다.

UPDATE videos
SET views = CAST(RAND() * 10000 AS UNSIGNED)

참고 RAND()의 첫 번째 인자

필자도 Stackoverflow 활동을 하면서 알게 된 사실이지만, RAND()는 1개의 인자를 허용하는데, 이때 주어지는 인자는 seed 값을 의미한다. 다음과 같이 동일한 seed 값은 동일한 RAND() 결과를 출력한다.

mysql> SELECT RAND(10);
+--------------------+
| RAND(10)           |
+--------------------+
| 0.6570515219653505 |
+--------------------+
1 row in set (0.00 sec)
 
mysql> SELECT RAND(10);
+--------------------+
| RAND(10)           |
+--------------------+
| 0.6570515219653505 |
+--------------------+
1 row in set (0.00 sec)

항상 동일한 순서로 RAND() 값을 생성시킬 때 seed 값을 활용할 수 있다.

seed 값이 없는 경우 다음과 같이 SELECT를 할 때마다 RAND()의 결과가 다르다.

mysql> SELECT id, RAND() FROM rand_test;
+------+----------------------+
| id   | RAND()               |
+------+----------------------+
|    1 | 0.020645528119658613 |
|    2 |  0.40559285358115366 |
|    3 |   0.9660277142804374 |
+------+----------------------+
3 rows in set (0.00 sec)
 
mysql> SELECT id, RAND() FROM rand_test;
+------+---------------------+
| id   | RAND()              |
+------+---------------------+
|    1 |  0.6133600413923711 |
|    2 | 0.16871709485418823 |
|    3 |  0.0035053808274729 |
+------+---------------------+
3 rows in set (0.00 sec)

하지만, RAND()에 seed 값을 동일하게 주면 RAND()를 호출할 때마다 동일한 RAND 값이 생성된다.

mysql> SELECT id, RAND(10) FROM rand_test;
+------+---------------------+
| id   | RAND(10)            |
+------+---------------------+
|    1 |  0.6570515219653505 |
|    2 | 0.12820613023657923 |
|    3 |  0.6698761160204896 |
+------+---------------------+
3 rows in set (0.00 sec)
 
mysql> SELECT id, RAND(10) FROM rand_test;
+------+---------------------+
| id   | RAND(10)            |
+------+---------------------+
|    1 |  0.6570515219653505 |
|    2 | 0.12820613023657923 |
|    3 |  0.6698761160204896 |
+------+---------------------+
3 rows in set (0.00 sec)

“MySQL” 카테고리의 추천 글