mysql利用存储过程以时间前缀生成流水号

作者:Liaodeity - 2016年03月08日

    看到一些项目中有流水号的记录,在一些项目开发中,通常都是利用存储过程来生成流水号,这样就可以简单的实现该过程。在网上看到有一个比较简单的实例,摘录下来,作为参考。

订单表结构

流水订单表,InnoDB引擎,利于事务处理

CREATE TABLE `test_orders` (    
  `id` int(11) NOT NULL AUTO_INCREMENT,    
  `orderNo` varchar(25) NOT NULL DEFAULT '',    
  `orderName` char(10) NOT NULL DEFAULT '',    
  PRIMARY KEY (`id`)    
) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8

存储过程

通过以下存储过程代码,实现流水号的生成,供作参考,在实际项目中,根据自己的需求加以修改,即可。

CREATE DEFINER=PROCEDURE `generate_orderNo`(in orderNamePre char(2), in num int, out newOrderNo varchar(25))    
BEGIN    
  DECLARE currentDate varCHAR (15) ;-- 当前日期,有可能包含时分秒     
  DECLARE maxNo INT DEFAULT 0 ; -- 离现在最近的满足条件的订单编号的流水号最后5位,如:SH2013011000002的maxNo=2     
--  DECLARE l_orderNo varCHAR (25) ;-- 新生成的订单编号     
--  DECLARE oldDate DATE ;-- 离现在最近的满足条件的订单编号的日期     
  DECLARE oldOrderNo VARCHAR (25) DEFAULT '' ;-- 离现在最近的满足条件的订单编号     
      
  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, '') INTO oldOrderNo     
  FROM test_orders     
  WHERE SUBSTRING(orderNo, 3, num) = currentDate     
    AND SUBSTRING(orderNo, 1, 2) = orderNamePre     
    and length(orderNo) = 7 + num    
  ORDER BY id DESC LIMIT 1 ; -- 有多条时只显示离现在最近的一条     
      
  IF oldOrderNo != '' THEN     
    SET maxNo = CONVERT(SUBSTRING(oldOrderNo, -5), DECIMAL) ;-- SUBSTRING(oldOrderNo, -5):订单编号如果不为‘‘截取订单的最后5位     
  END IF ;    
  SELECT     
    CONCAT(orderNamePre, currentDate,  LPAD((maxNo + 1), 5, '0')) INTO newOrderNo ; -- LPAD((maxNo + 1), 5, '0'):如果不足5位,将用0填充左边     
      
  INSERT INTO test_orders (orderNo, orderName) VALUES (newOrderNo, 'testNo') ; -- 向订单表中插入数据     
--    set newOrderNo = l_orderNo;     
  SELECT     
    newOrderNo ;    
END


来源于: http://blog.csdn.net/dengsilinming/article/details/8488626

本文作者: Liaodeity

本文链接: https://www.jianbaizhan.com/article/362

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!


 请勿发布不友善或者负能量的内容。审查将对发布广告等违规信息进行处罚!