MySQL使用过程存储生成唯一订单号

数据库表:

/*
Navicat MySQL Data Transfer

Source Server         : local
Source Server Version : 50640
Source Host           : localhost:3306
Source Database       : springsecurity

Target Server Type    : MYSQL
Target Server Version : 50640
File Encoding         : 65001

Date: 2018-08-25 22:10:57
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for orders
-- ----------------------------
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
  `orderNo` varchar(30) NOT NULL COMMENT ‘订单号‘,
  `productTypes` varchar(11) NOT NULL COMMENT ‘商品类型‘,
  `orderNumber` int(11) DEFAULT NULL COMMENT ‘商品数量‘,
  `unitPrice` decimal(10,2) unsigned zerofill DEFAULT NULL COMMENT ‘单价‘,
  `totalPrice` decimal(10,2) unsigned zerofill DEFAULT NULL COMMENT ‘总价‘,
  PRIMARY KEY (`orderNo`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

创建过程存储:

CREATE PROCEDURE `generate`(in orderNamePre char(2),in productTypes VARCHAR(20),
in orderNumber INT(10),in unitPrice decimal(10,2))
-- 输入当前订单名以及时间长度,输出订单号
BEGIN
  DECLARE newOrderNo varchar(25);
  DECLARE currentDate varCHAR (15) ;-- 当前日期,有可能包含时分秒
  DECLARE maxNo INT DEFAULT 0 ; -- 离现在最近的满足条件的订单编号的流水号最后5位,如:SH2013011000002的maxNo=2
  DECLARE oldOrderNo VARCHAR (25) DEFAULT ‘‘ ;-- 离现在最近的满足条件的订单编号   

--   SELECT DATE_FORMAT(NOW(), ‘%Y%m%d%H%i%s‘) INTO currentDate ;-- 年月日时分秒共14位数
    SELECT DATE_FORMAT(NOW(), ‘%Y%m%d%H%i‘) INTO currentDate ;-- 年月日时分秒共14位数

        -- SUBSTRING() 字符串截取函数
  SELECT IFNULL(orderNo, ‘‘) INTO oldOrderNo
  FROM orders
  WHERE SUBSTRING(orderNo, 3, 12) = currentDate   -- 截取时间段
    AND SUBSTRING(orderNo, 1, 2) = orderNamePre    -- 截取当前订单名
  ORDER BY orderNo DESC LIMIT 1 ; -- 有多条时只显示离现在最近的一条   

    -- 判断是否拥有当前时间段订单
  IF oldOrderNo != ‘‘ THEN
    SET maxNo = SUBSTRING(oldOrderNo, -5);
  END IF ;  

  SELECT CONCAT(orderNamePre, currentDate,  LPAD((maxNo + 1), 5, ‘0‘)) INTO newOrderNo ;
        -- LPAD((maxNo + 1), 5, ‘0‘):如果不足5位,将用0填充左边
  INSERT INTO orders (orderNo,productTypes,orderNumber,unitPrice,totalPrice) VALUES (newOrderNo,productTypes,orderNumber,unitPrice,FORMAT(orderNumber*unitPrice,2)) ; -- 向订单表中插入数据
END

调用过程存储:

CALL generate("TT","休闲裤",2,198.60)

最后成功往表中插入数据:

原文地址:https://www.cnblogs.com/zhazhadequshi/p/9535613.html

时间: 2024-08-29 03:29:48

MySQL使用过程存储生成唯一订单号的相关文章

php生成唯一订单号

支持更改长度/** * 生成唯一订单号 * */ function build_order_no(){ return date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8); }

如何生成唯一订单号(转)

首先,订单号有3个性质:1.唯一性 2.不可推测性 3.效率性 唯一性和不可推测性不用说了,效率性是指不能频繁的去数据库查询以避免重复.况且满足这些条件的同时订单号还要足够的短.我在java下定制的订单号生成方式如下:int r1=(int)(Math.random()*(10));//产生2个0-9的随机数int r2=(int)(Math.random()*(10));long now = System.currentTimeMillis();//一个13位的时间戳String paymen

c# asp.net 生成唯一订单号

c# asp.net 生成唯一订单号 string OrderNo = DateTime.Now.Year.ToString().Substring(2, 2) + DateTime.Now.Month.ToString().PadLeft(2, '0') + DateTime.Now.Day.ToString().PadLeft(2, '0') + DateTime.Now.Hour.ToString().PadLeft(2, '0') + DateTime.Now.Minute.ToStri

C# 生成唯一订单号

根据GUID+DateTime.Now.Ticks生产唯一订单号 1 /// <summary> 2 /// 生成唯一数 3 /// </summary> 4 public class UniqueData 5 { 6 private static object obj = new object(); 7 private static int GuidInt { get { return Guid.NewGuid().GetHashCode(); } } 8 private sta

mysql使用触发器生成唯一订单号,

需求:订单号唯一,并且期望是时间格式加其他字符串, 实现:采用触发机制,在新增时根据新增id值加1作为订单生成的随机且确定唯一的数,因为id唯一: 遇到问题:新增时不能提前知道id值, 解决:取到当前表中最大值+1即为id: 业务需要研究几个小时终于实现一套可行方案: 代码: 建表 DROP TABLE IF EXISTS `qs_test`; CREATE TABLE `qs_test` ( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `ord

生成唯一订单号 (支持每秒1000个并发)

#region 订单号生成(支持每秒1000个并发) private static object locker = new object(); private static int sn = 0; public static string GetOrderNO() { lock (locker) { if (sn == 999) sn = 0; else sn++; return DateTime.Now.ToString("yyMMddHHmmssfff") + sn.ToStrin

两个PHP方面的东西,超过2038的时间和唯一订单号算法

2014年10月01日  php开发 1条评论 阅读264次 DateTime::format 被设计成不受外部设置影响(面向对象就应该如此)所以无论你如何改变环境参数 date_default_timezone ,都不会影响输出结果要想改变 DateTime::format 的时区设置,需要向 DateTime::setTimezone 传入一个时区对象 DateTimeZone 1 $d = new DateTime('@2444486400'); 2 $d->setTimezone(new

c#唯一订单号生成代码

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string uniqueNum = GenerateOrderNumber(); Console.WriteLin

生成随机订单号

//生成随机订单号 $yCode = array('A','B','C','D','E','F','G','H','I','J'); $orderid = $yCode[intval(date('Y')) - 2011] . strtoupper(dechex(date('m'))) . date('d') . substr(time(), -5) . substr(microtime(), 2, 5) . sprintf('%02d', rand(0, 99));