需求内容是生成固定长度的字符串,首位必须是指定数字开头。实现的存储过程和函数如下:
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_data`(IN iteme INT)
BEGIN
DECLARE var INT DEFAULT 1;
start transaction;
WHILE var<iteme
DO
insert into table (col1,col2,col3,col4) values (rand_string(10),1001,'2015-07-10 16:00:00',0);
SET var=var+1;
END WHILE;
commit;
END
CREATE FUNCTION `rand_string`(n int) RETURNS varchar(255) CHARSET utf8
BEGIN
DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
DECLARE return_str varchar(255) DEFAULT '';
DECLARE i INT DEFAULT 0;
WHILE i < n
DO
SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*62 ),1));
SET i = i +1;
END WHILE;
RETURN return_str;
END
函数为网上找的的版本:http://xue.uplook.cn/database/mysqlsjk/2392.html
直接call proc_data(6);即可
bug1:生成大量数据时唯一键冲突较多,目前解决办法是多次运行。 o(╯□╰)o
bug2 : 生成字符串会有小于指定位数的,例如需要生成的随机数是10位,可能有4位,5位,6位的出现.
ps:bug2已找到原因,在生成手机使用的随机符时,为了方便辨认,去掉了数字1和字母I,于是chars_str的长度由62缩小为60.在运算时需要将函数FLOOR(1 + RAND()*62也进行相应的修改,即FLOOR(1 + RAND()*60.
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_data`(IN iteme INT)
BEGIN
DECLARE var INT DEFAULT 1;
start transaction;
WHILE var<iteme
DO
insert into table (col1,col2,col3,col4) values (rand_string(10),1001,'2015-07-10 16:00:00',0);
SET var=var+1;
END WHILE;
commit;
END
CREATE FUNCTION `rand_string`(n int) RETURNS varchar(255) CHARSET utf8
BEGIN
DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
DECLARE return_str varchar(255) DEFAULT '';
DECLARE i INT DEFAULT 0;
WHILE i < n
DO
SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*62 ),1));
SET i = i +1;
END WHILE;
RETURN return_str;
END
函数为网上找的的版本:http://xue.uplook.cn/database/mysqlsjk/2392.html
直接call proc_data(6);即可
bug1:生成大量数据时唯一键冲突较多,目前解决办法是多次运行。 o(╯□╰)o
bug2 : 生成字符串会有小于指定位数的,例如需要生成的随机数是10位,可能有4位,5位,6位的出现.
ps:bug2已找到原因,在生成手机使用的随机符时,为了方便辨认,去掉了数字1和字母I,于是chars_str的长度由62缩小为60.在运算时需要将函数FLOOR(1 + RAND()*62也进行相应的修改,即FLOOR(1 + RAND()*60.