基於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以內,算是相對較快了.如果有好的辦法,希望能在下面評論告訴我下,謝謝!