안내
본 문서는 블로그의 운영자인 본인이 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” 카테고리의 추천 글
- MySQL IN subquery 성능. IN sub query는 가급적 사용을 피하자
- MySQL의 IN() v.s. EXISTS v.s. INNER JOIN 성능 비교
- MySQL INNER JOIN v.s EXISTS 성능 비교
- JOIN에서 중복된 레코드 제거하기
- MySQL 중복 레코드 관리 방법 - INSERT IGNORE, REPLACE INTO, ON DUPLICATE UPDATE
- MySQL GROUP BY 성능 최적화를 위한 INDEX 설계
- MySQL Query Cache를 빠르게 비우기
- MySQL Plugin에 대한 간단한 소개
- MySQL InnoDB Index Statistics
- MySQL Foreign key 사용 시 주의 사항 (Can’t create table (errno: 150))