最近遇到一个需求是需要构造百万级数据测试查询速度,导出数据,统计等功能是否正常,其中条码号是从0000000000001开始累加,此时需要创建两条存储过程插入数据库,一条生成条码号,一条插入数据到数据库。
创建生成条码号的sql函数:
CREATE DEFINER=`root`@`%` PROCEDURE `genarate_code`(OUT code1 varchar(30))
BEGIN
DECLARE current_number INT DEFAULT 0;
DECLARE new_number INT;
DECLARE suffix_number varchar(12) DEFAULT '000000000000';
SELECT MAX(code) INTO current_number FROM a01_archbox;
IF current_number IS NULL THEN
SET new_number = 1;
ELSE
SET new_number = current_number + 1;
END IF;
set suffix_number = substring(suffix_number,1,13-length(new_number));
set code1 = concat(suffix_number,new_number);
END
该函数生成规则按已有条码号开始生成,若没有则从0000000000001开始,若是生成类似订单号的生成规则,则按订单号生成规则调整即可,例如加上日期流水号等规则生成
存储过程声明变量方式:DECLARE current_number INT DEFAULT 0;
存储过程返回值需在函数名称加变量:genarate_code(OUT code1 varchar(30))
运行插入数据的sql函数:
CREATE DEFINER=`root`@`%` PROCEDURE `add_box`()
BEGIN
DECLARE i int DEFAULT 1;
declare c varchar(30) DEFAULT 'test';
-- 开启事务
START TRANSACTION;
WHILE i<10 DO
call genarate_code(@code);
-- select @code;
insert into a01_archbox(`id`,`code`,`category_id`,`store_id`,`qu_no`,`col_no`,`zy_no`,`le_no`,`div_no`,`sx_no`,`lend_state`,`c403`,`box_type`) values(UUID_SHORT(),@code,6,1,floor(rand()*5)+1,floor(rand()*3)+1,floor(RAND()*1+1.5),floor(RAND()*3)+1,floor(rand()*3)+1,0,1,concat(c,i),7);
set i=i+1;
END WHILE;
-- 提交事务
COMMIT;
END
其中call genarate_code(@code);是调用生成条码的函数,@code是函数生成条码后的返回值
floor(rand()*3)+1是随机生成1~3的随机正整数
运行结果: