因需要大量不重复随机数(纯数字)作为业务数据使用,在网上找了好多方法都不太适合,经过借鉴和思考,总结出了自己的方法,记录一下:
表结构很简单,就两列:
建表语句:
CREATE TABLE `dt` (
`RandomNO` int(11) DEFAULT NULL,
`RandomValue` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
存储过程:
CREATE DEFINER=`xxx(数据库用户名)`@`localhost` PROCEDURE `insert_rdno`(in min int(10), in max int(10))
BEGIN
DECLARE i int default 0;
DECLARE a int default 0;
set autocommit = 0;
repeat
set a = FLOOR( min + RAND() * ( max+1-min ) );
insert into dt(RandomNO,RandomValue) VALUES (a,(min+i));
set i = i+1;
until min+i-1 = max
end repeat;
commit;
END
说明:
1,生成(max-min+1)个min至max 的顺序数列和min到max之间的随机数(可能有重复),插入表的value列和no列。
2,将数据按随机数(no列)排序(正序倒序都可以)此时value列即为想得到的数据了。
3,接下来就简单多了,这些数想怎么挪动就怎么挪动吧。
举例:
现在要生成100000及以上的所有随机6位数即[100000,999999]90万个随机数,
1,执行存储过程:
执行结果:
90万数据用时14秒,还可以接受吧!
看下表怎么样了: