mysql 生成流水号 存储过程 订单编号

用存储过程生成流水号是很常用的,这里以生成订单编号的流水号作为示例。(新的一天的流水号从1开始,如:今天的订单编号是CD2013010900014,下一个订单编号将是CD2013010900015;明天的订单编号将从CD2013011000001开始)

生成规则:2位前缀+年月日+5位流水号 或者 2位前缀+年月日时分+5位流水号 或者 2位前缀+年月日时分秒+5位流水号。

测试订单表(test_orders):

[sql]  view plain copy
  1. CREATE TABLE `test_orders` (    
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,    
  3.   `orderNo` varchar(25) NOT NULL DEFAULT '',    
  4.   `orderName` char(10) NOT NULL DEFAULT '',    
  5.   PRIMARY KEY (`id`)    
  6. ) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8  

生成订单编号的存储过程(generate_orderNo):

[sql]  view plain copy
  1. CREATE DEFINER=PROCEDURE `generate_orderNo`(in orderNamePre char(2), in num intout newOrderNo varchar(25))    
  2. BEGIN    
  3.   DECLARE currentDate varCHAR (15) ;-- 当前日期,有可能包含时分秒     
  4.   DECLARE maxNo INT DEFAULT 0 ; -- 离现在最近的满足条件的订单编号的流水号最后5位,如:SH2013011000002的maxNo=2     
  5. --  DECLARE l_orderNo varCHAR (25) ;-- 新生成的订单编号     
  6. --  DECLARE oldDate DATE ;-- 离现在最近的满足条件的订单编号的日期     
  7.   DECLARE oldOrderNo VARCHAR (25) DEFAULT '' ;-- 离现在最近的满足条件的订单编号     
  8.       
  9.   if num = 8 then -- 根据年月日生成订单编号     
  10.     SELECT DATE_FORMAT(NOW(), '%Y%m%d'INTO currentDate ;-- 订单编号形式:前缀+年月日+流水号,如:SH2013011000002     
  11.   elseif num = 14 then -- 根据年月日时分秒生成订单编号     
  12.     SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i%s'INTO currentDate ; -- 订单编号形式:前缀+年月日时分秒+流水号,如:SH2013011010050700001,个人不推荐使用这种方法生成流水号     
  13.   else -- 根据年月日时分生成订单编号     
  14.     SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i'INTO currentDate ;-- 订单形式:前缀+年月日时分+流水号,如:SH20130110100900005     
  15.   end if ;    
  16.       
  17.   SELECT IFNULL(orderNo, ''INTO oldOrderNo     
  18.   FROM test_orders     
  19.   WHERE SUBSTRING(orderNo, 3, num) = currentDate     
  20.     AND SUBSTRING(orderNo, 1, 2) = orderNamePre     
  21.     and length(orderNo) = 7 + num    
  22.   ORDER BY id DESC LIMIT 1 ; -- 有多条时只显示离现在最近的一条     
  23.       
  24.   IF oldOrderNo != '' THEN     
  25.     SET maxNo = CONVERT(SUBSTRING(oldOrderNo, -5), DECIMAL) ;-- SUBSTRING(oldOrderNo, -5):订单编号如果不为‘‘截取订单的最后5位     
  26.   END IF ;    
  27.   SELECT     
  28.     CONCAT(orderNamePre, currentDate,  LPAD((maxNo + 1), 5, '0')) INTO newOrderNo ; -- LPAD((maxNo + 1), 5, '0'):如果不足5位,将用0填充左边     
  29.       
  30.   INSERT INTO test_orders (orderNo, orderName) VALUES (newOrderNo, 'testNo') ; -- 向订单表中插入数据     
  31. --    set newOrderNo = l_orderNo;     
  32.   SELECT     
  33.     newOrderNo ;    
  34. END  

参数说明:orderNamePre:(输入)订单编号的前缀,这里设定为两个字符
                  num:(输入)将按什么规则生成流水号(生成规则有:年月日、年月日时分秒、年月日时分三种),可选的num有:8、12、14
                  newOrderNo:(输出)新生成的订单编号

生成中的一些说明在存储过程中已经写得很明确了,这里不再重复。

调用存储过程向表中插入数据:

[sql]  view plain copy
  1. SET @orderNo = '';    
  2. CALL `generate_orderNo`('SH', 12, @orderNo);    
  3. SELECT @orderNo;  

查看生成的数据(我这里调用了很多次,所以生成的数据很多):

         

在实际项目中只需要修改其中的一些生成规则即可,到此为止,流水号的生成就搞定了,是不是很简单 微笑

有关mysql存储过程的知识可以参考我的这篇文章:http://blog.csdn.net/dengsilinming/article/details/8484880

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值