技术

Mysql生成连续订单编号

使用Mysql数据库生成时间日期连续的订单编号.

1.创建表:

 DROP TABLE IF EXISTS `bbc_generate_serialno`;
CREATE TABLE `bbc_generate_serialno` (
`id` int(20) DEFAULT NULL,
`orderno` varchar(50) DEFAULT NULL,
`orderpre` varchar(30) DEFAULT NULL,
`ordervalue` int(20) DEFAULT NULL,
`ordertime` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

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;-- 提交事务

SELECT
newOrderNo ;
END
;;
DELIMITER ;

3.请求方法:

call generate_orderNo(‘SH’,8,@orderNo);

注意生成存储过程的的时候要注意权限的问题;根据年月日生成的订单编号就生成了.每次请求序列号增加1;