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

php中文网
发布: 2016-06-10 15:12:14
原创
2482人浏览过

用存储过程生成流水号是很常用的,这里以生成订单编号的流水号作为示例。(新的一天的流水号从1开始,如:今天的订单编号是CD2013 0109 00014 ,下一个订单编号将是 CD 2013 0109 00015 ; 明天的订单编号将从 CD 2013 0110 00001 开始) 生成规则:2位前缀

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

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

测试订单表(test_orders):

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
登录后复制

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

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
登录后复制

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

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

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

 v7.0.0603UsualToolCMS大众版
v7.0.0603UsualToolCMS大众版

UsualToolCMS 是一款企业级的网站内容管理系统,由PHP+MYSQL编写,使用模板分离技术,支持创建多种类型的站点。 拥有UsualToolCMS便能快速同时在手机端与电脑端建立网站,通过UsualToolCMS能快速接入公众号,快速生成一个微信小程序及WEBAPP,真正的多站合一。互联网技术变得更简单。 升级说明: UsualToolCMS7.0.0604增加文字/图片自动水印系

 v7.0.0603UsualToolCMS大众版 77
查看详情  v7.0.0603UsualToolCMS大众版

SET @orderNo = '';  
CALL `generate_orderNo`('SH', 12, @orderNo);  
SELECT @orderNo;
登录后复制

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

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

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

有关mysql存储过程的知识可以参考我的这篇文章:MySQL存储过程详解

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号