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

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

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

测试订单表(test_orders):

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):

 1     CREATE DEFINER=PROCEDURE `generate_orderNo`(in orderNamePre char(2), in num int, out 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:(输出)新生成的订单编号

调用存储过程向表中插入数据:
    SET @orderNo = ‘‘;    
    CALL `generate_orderNo`(‘SH‘, 12, @orderNo);    
    SELECT @orderNo;

查看生成的数据:
        

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

有关mysql存储过程的知识可以参考:MySQL存储过程详解

时间: 2024-10-11 22:20:07

mysql 生成流水号 存储过程 订单编号的相关文章

MySql生成流水号

基础规则表Rul_Sequence: 规则表中的数据: 辅助存储过程: CREATE DEFINER=`root`@`%` PROCEDURE `proc_getseqence`(IN `SeqCode` VARCHAR(60), OUT `ReturnNum` VARCHAR(40), OUT `MessageCode` VARCHAR(800)) COMMENT '获取序列号' BEGIN declare SeqNowNumStr VARCHAR(20); declare SeqNowNum

SQL Server 存储过程生成流水号

SQL Server利用存储过程生成流水号 USE BiddingConfig SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GO -- ============================================= -- Author: 小爽 -- Create date: 2017-05-25 -- Description: 业务数据KEY生成 -- 构成规则: [区域编号][应用系统编号][版本编号][功能编号][日期戳][流水记录号]

Java秒杀系统实战系列~分布式唯一ID生成订单编号

摘要: 本篇博文是"Java秒杀系统实战系列文章"的第七篇,在本博文中我们将重点介绍 "在高并发,如秒杀的业务场景下如何生成全局唯一.趋势递增的订单编号",我们将介绍两种方法,一种是传统的采用随机数生成的方式,另外一种是采用当前比较流行的"分布式唯一ID生成算法-雪花算法"来实现. 内容: 在上一篇博文,我们完成了商品秒杀业务逻辑的代码实战,在该代码中,我们还实现了"当用户秒杀成功后,需要在数据库表中为其生成一笔秒杀成功的订单记录&qu

多线程调用生成主键流水号存储过程产生主键冲突问题解决方案

遇到开发多线程测试插入数据的时候发现主键冲突问题 问题具体描述如下: -------------------------------------------------------------- 调用Procedure_insert Procedure_insert Begin Call procedure(获取流水号) Insert into table values(流水号作为id,其他列); End 流水号存储过程: Update 统计表 统计字段+1 Update 统计表 最终流水号 s

生成订单编号的工具类

package com.qiyuan.util; import java.text.SimpleDateFormat; import java.util.Date; public class orderCode { //订单编号前缀 public static final String PREFIX = "DD"; //订单编号后缀(核心部分) private static long code; // 生成订单编号 public static synchronized String g

单例模式生成订单编号

package com.jeeplus.modules.biz.util; import java.text.SimpleDateFormat;import java.util.Date;import java.util.Random; /** * 单例模式 * 生成订单编号 */public class SingletonUtil { private volatile static SingletonUtil singletonUtil; private SingletonUtil(){} p

Java并发生成不重复订单流水号

最近做一个订单模块要生成订单号,因为考虑到用Mysql主键做订单号在以后分库分表后会重复,就想到自己创建. 这里要涉及到并发操作,所以要么就用单例内部类,或者就是加锁,因为时间关系我先实现了内部类和锁,后续再用类把String替换了. 具体代码: package com.jzg.svsp.order.utils; import javax.validation.constraints.NotNull; import java.text.SimpleDateFormat; import java.

生成自增的编号,生成订单号

生成自增的编号: /**  * 生成工单编码  *   * @param workSheetType  *            工单类型  * @param systemName  *            系统名称  * @param cityCode  *            城市编码  * @return 形如AAA-BBB-CC-081127-0029  */ public synchronized String nextWorkSheetNum(String workSheetTy

Mysql的数据库存储过程的初始接触

之前一直搞oracle,来到新公司后接触mysql虽然感觉差不多,但是mysql的还是很不方便,比如以下函数都不支持turnc这样的简单函数. 打算写一个订单号的存储过程,类似  字母+年月日编号 BEGIN DECLARE currentDate varCHAR (15) ;-- 当前日期,有可能包含时分秒 DECLARE maxNo INT DEFAULT 0 ; -- 离现在最近的满足条件的订单编号的流水号最后5位,如:SH2013011000002的maxNo=2 SELECT DATE