基於MYSQL存儲過程生成1-10萬,不重復隨機數.


基於MYSQL存儲過程生成1-10萬,不重復隨機數.

DELIMITER //

/*創建生成隨機數存儲過程*/
DROP PROCEDURE IF EXISTS RD1 //
CREATE PROCEDURE RD1()
BEGIN
DECLARE NM int;#定義變量
DECLARE RW int;#定義變量
DECLARE MN int;#定義變量

/*創建需要用到臨時表1*/
DROP TABLE IF EXISTS TMP_TEST1;
CREATE TEMPORARY TABLE TMP_TEST1(
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
NUM INT NOT NULL
)ENGINE=MEMORY,CHARSET=utf8;

/*創建需要用到臨時表2*/
DROP TABLE if exists TMP_TEST2;
CREATE TEMPORARY TABLE TMP_TEST2(
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
NUM INT NOT NULL
)ENGINE=MEMORY,CHARSET=utf8;
SET RW = 100000;#給變量賦予初始值10萬7
SET MN = (SELECT CAST(REPLACE(LEFT(CURDATE(),7),'-','') AS UNSIGNED INTEGER));#獲得當前時間如:201702 這樣的格式
WHILE RW > 0 DO#循環開始
SET NM = (SELECT ROUND(RAND()*100000));#隨機數種子
INSERT INTO TMP_TEST1(`NUM`) VALUES(NM);#寫入臨時表
SET RW = RW - 1;
END WHILE;
INSERT INTO TMP_TEST2(`NUM`) SELECT ID FROM TMP_TEST1 ORDER BY NUM ASC;#從臨時表1轉移數據到臨時表2通過order by來生成隨機數
INSERT INTO RECORD_RM (`ID_RM`,`NUM`,`THEMONTH`) SELECT ID,NUM,(select MN) FROM TMP_TEST2;#從臨時表2把數據導入到正式表
END //#存儲過程結束
CALL RD1() //#調用存儲過程
DROP PROCEDURE RD1//#刪除存儲過程
DELIMITER ;

附上RECORD_RM表建表SQL:

DROP TABLE IF EXISTS RECORD_RM;
CREATE TABLE RECORD_RM(
ID_RM INT UNSIGNED NOT NULL,
THEMONTH INT UNSIGNED NOT NULL,
NUM INT UNSIGNED NOT NULL,
PRIMARY KEY(ID_RM,THEMONTH)
)ENGINE=MYISAM,CHARSET=utf8;

總體執行速度10S以內,算是相對較快了.如果有好的辦法,希望能在下面評論告訴我下,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM