Sử dụng RAND() kết hợp FLOOR() để tạo số ngẫu nhiên trong khoảng, sau đó cộng vào cột hiện tại qua UPDATE.
Công thức số ngẫu nhiên trong khoảng [min, max]
FLOOR(RAND() * (max - min + 1)) + min
Với khoảng 30-300: FLOOR(RAND() * 271) + 30 (vì 300-30+1=271)
Ví dụ minh họa
Tạo bảng demo:
mysql> CREATE TABLE RandomNumberDemo (MyNumber INT);
Chèn dữ liệu:
mysql> INSERT INTO RandomNumberDemo VALUES (17), (18), (29);
Xem dữ liệu:
mysql> SELECT * FROM RandomNumberDemo;
+----------+ | MyNumber | +----------+ | 17 | | 18 | | 29 | +----------+
Cập nhật hàng MyNumber=18, cộng thêm số ngẫu nhiên 30-300:
mysql> UPDATE RandomNumberDemo
-> SET MyNumber = MyNumber + FLOOR(RAND() * 271) + 30
-> WHERE MyNumber = 18;
Query OK, 1 row affected (0.20 sec)
Kết quả (ví dụ: 18 + 140 = 158):
mysql> SELECT * FROM RandomNumberDemo;
+----------+ | MyNumber | +----------+ | 17 | | 158 | | 29 | +----------+
Các biến thể hữu ích
| Mục đích | Công thức |
|---|---|
| Số thực ngẫu nhiên [0,1) | RAND() |
| Số nguyên [0, N] | FLOOR(RAND() * (N+1)) |
| Số nguyên [A, B] | FLOOR(RAND() * (B-A+1)) + A |
| Số thực [A, B] | RAND() * (B-A) + A |
| Chọn ngẫu nhiên 1 hàng | ORDER BY RAND() LIMIT 1 |
⚠️ Lưu ý hiệu năng
ORDER BY RAND()rất chậm trên bảng lớn (filesort toàn bộ)- Cách tốt hơn cho bảng lớn:
WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM table))) - RAND() được tính lại cho mỗi hàng trong UPDATE → mỗi hàng nhận giá trị ngẫu nhiên khác nhau
Seed cố định (reproducible)
SELECT RAND(12345); -- Luôn trả về cùng chuỗi với seed 12345