INSERT INTO `bbc_generate_serialno` VALUES (‘1’, ‘SH20190114000002’, ‘SH’, ‘2’, ‘2019-01-14 15:55:23’);
2.创建存储过程
DROP PROCEDURE IF EXISTS `generate_orderNo`; DELIMITER ;; CREATE DEFINER=`root`@`%` PROCEDURE `generate_orderNo`(IN orderNamePre CHAR(2), IN num INT, OUT newOrderNo VARCHAR(25)) BEGIN DECLARE oldOrderNo VARCHAR (25) DEFAULT '' ;-- 离现在最近的满足条件的订单编号 DECLARE currentDate VARCHAR (15) ;-- 当前日期,有可能包含时分秒 DECLARE ordercurrentDate VARCHAR (15) ;-- 订单的当前日期,有可能包含时分秒 DECLARE orderNameValue INT; -- 订单变化的值 DECLARE orderNameNum INT DEFAULT 6; -- 订单变化的值
IF num = 8 THEN -- 根据年月日生成订单编号 SELECT DATE_FORMAT(NOW(), '%Y%m%d') INTO currentDate ;-- 订单编号形式:前缀+年月日+流水号,如:SH2013011000002 ELSEIF num = 14 THEN -- 根据年月日时分秒生成订单编号 SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i%s') INTO currentDate ; -- 订单编号形式:前缀+年月日时分秒+流水号,如:SH2013011010050700001,个人不推荐使用这种方法生成流水号 ELSE -- 根据年月日时分生成订单编号 SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i') INTO currentDate ;-- 订单形式:前缀+年月日时分+流水号,如:SH20130110100900005 END IF ;
-- 获得当前的订单和变化的值 SELECT IFNULL(orderno, ''),IFNULL(ordervalue+1,0),IFNULL(DATE_FORMAT(ordertime, '%Y%m%d'),'') INTO oldOrderNo,orderNameValue,ordercurrentDate FROM bbc_generate_serialno WHERE id=1 FOR UPDATE; -- 验证当天的时间
-- 如果存在在原来的基础上加1,不存在从1开始 IF oldOrderNo!=''&&ordercurrentDate=currentDate THEN -- 订单号不为空,并且 ,当前订单时间和当前时间相同,再原来基础上+1,否则新的一天从1开始 SELECT CONCAT(orderNamePre, currentDate,LPAD(orderNameValue, orderNameNum, '0')) INTO newOrderNo ; ELSE SELECT CONCAT(orderNamePre, currentDate,LPAD(1, orderNameNum, '0')),1 INTO newOrderNo,orderNameValue; END IF;
SET autocommit=0;-- 禁止自动提交 -- 订单存在更改id为1的记录,不存在插入id为1的记录 IF oldOrderNo!='' THEN UPDATE bbc_generate_serialno SET orderno=newOrderNo,orderpre=orderNamePre,ordertime=NOW(),ordervalue=orderNameValue WHERE id=1; ELSE INSERT INTO bbc_generate_serialno(id,orderno,orderpre,ordertime,ordervalue) VALUES(1,newOrderNo,orderNamePre,NOW(),1); END IF; COMMIT;-- 提交事务