在測試數據構造、數據脫敏、模擬業務場景等場景中,向 MySQL 表字段插入或更新隨機數是高頻需求。本文系統梳理 MySQL 隨機數生成的核心函數、進階技巧及批量操作最佳實踐,助你高效完成測試數據準備。
`RAND()` 返回 0 到 1 之間的浮點數(含 0,不含 1)。若提供種子參數 `RAND(seed)`,則生成確定性序列,便於測試復現。
目標:生成 [min, max] 閉區間內的隨機整數。
-- 通用公式:FLOOR(RAND() * (max - min + 1)) + min -- 示例:生成 100 到 999 之間的隨機整數 SELECT FLOOR(RAND() * 900) + 100;
-- 將 click 欄位更新為 500,000 ~ 999,999 之間的隨機數 UPDATE `article` SET `click` = FLOOR(RAND() * 500000) + 500000;
-- 僅更新 classid=2 且 click>2000 的記錄,click 縮減為原值 1% UPDATE `article` SET `click` = `click` * 0.01 WHERE `classid` = '2' AND `click` > 2000;
-- 為 id=13 的記錄賦予 0~10 的隨機整數 UPDATE `storm_effect_info` s SET s.fhtp = FLOOR(RAND() * 11) WHERE s.id = 13;
雖然 `FLOOR()` 已返回整數,但顯式轉換可消除隱式類型轉換風險:
-- 推薦寫法:明確轉為 SIGNED 整數 SELECT CAST(RAND() * 10 AS SIGNED) AS rand_int; -- 批量更新時同理 UPDATE `t` SET `col` = CAST(RAND() * 100 AS SIGNED);
逐行 `UPDATE` 效率極低,採用以下方案:
-- 1. 創建臨時表存儲主鍵與隨機值 CREATE TEMPORARY TABLE tmp_rand AS SELECT id, FLOOR(RAND() * 500000) + 500000 AS rand_val FROM `article` WHERE `classid` = '2'; -- 2. 聯表更新(秒級完成百萬行) UPDATE `article` a JOIN tmp_rand t ON a.id = t.id SET a.click = t.rand_val; -- 3. 清理 DROP TEMPORARY TABLE tmp_rand;
DELIMITER //
CREATE PROCEDURE batch_update_rand(IN batch_size INT)
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE min_id, max_id BIGINT;
SELECT MIN(id), MAX(id) INTO min_id, max_id FROM `article` WHERE `classid` = '2';
WHILE min_id <= max_id DO
UPDATE `article`
SET `click` = FLOOR(RAND() * 500000) + 500000
WHERE `classid` = '2' AND id BETWEEN min_id AND min_id + batch_size - 1;
SET min_id = min_id + batch_size;
COMMIT; -- 每批提交,釋放鎖
END WHILE;
END//
DELIMITER ;
-- 調用:每批 5000 行
CALL batch_update_rand(5000);
掌握 MySQL 隨機數生成的核心公式與批量操作模式,能讓測試數據準備從「小時級」縮短至「秒級」。實戰中請根據數據量級、業務約束選擇合適方案,並始終在預發環境驗證後再投入生產。