mysql生成唯一订单号_用mysql的存储过程实现生成唯一订单号

DELIMITER $$

USE `roamerbuddy`$$

DROP PROCEDURE IF EXISTS `generate_orderNo`$$

CREATE DEFINER=`root`@`%` PROCEDURE `generate_orderNo`(IN orderNamePre CHAR(2), IN num INT, OUT newOrderNo VARCHAR(25))

BEGIN

DECLARE oldOrderNo VARCHAR (25) DEFAULT '' ;-- 离现在最近的满足条件的订单编号

DECLARE currentDate VARCHAR (15) ;-- 当前日期,有可能包含时分秒

DECLARE ordercurrentDate VARCHAR (15) ;-- 订单的当前日期,有可能包含时分秒

DECLARE orderNameValue INT; -- 订单变化的值

DECLARE orderNameNum INT DEFAULT 6; -- 订单变化的值

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, ''),IFNULL(ordervalue+1,0),IFNULL(DATE_FORMAT(ordertime, '%Y%m%d'),'') INTO oldOrderNo,orderNameValue,ordercurrentDate

FROM generate_serialno

WHERE id=1 FOR UPDATE; -- 验证当天的时间

-- 如果存在在原来的基础上加1,不存在从1开始

IF oldOrderNo!=''&&ordercurrentDate=currentDate THEN -- 订单号不为空,并且 ,当前订单时间和当前时间相同,再原来基础上+1,否则新的一天从1开始

SELECT CONCAT(orderNamePre, currentDate,LPAD(orderNameValue, orderNameNum, '0')) INTO newOrderNo ;

ELSE

SELECT CONCAT(orderNamePre, currentDate,LPAD(1, orderNameNum, '0')),1 INTO newOrderNo,orderNameValue;

END IF;

SET autocommit=0;-- 禁止自动提交

-- 订单存在更改id为1的记录,不存在插入id为1的记录

IF oldOrderNo!='' THEN

UPDATE generate_serialno SET orderno=newOrderNo,orderpre=orderNamePre,ordertime=NOW(),ordervalue=orderNameValue WHERE id=1;

ELSE

INSERT INTO generate_serialno(id,orderno,orderpre,ordertime,ordervalue) VALUES(1,newOrderNo,orderNamePre,NOW(),1);

END IF;

COMMIT;-- 提交事务

SELECT

newOrderNo ;

END$$

DELIMITER ;

DROP TABLE IF EXISTS `generate_serialno`;

CREATE TABLE `generate_serialno` (

`id` int(20) DEFAULT NULL,

`orderno` varchar(50) DEFAULT NULL,

`orderpre` varchar(30) DEFAULT NULL,

`ordervalue` int(20) DEFAULT NULL,

`ordertime` datetime DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8; CALL `generate_orderNo`('Y', 8, @orderNo);

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设库存信息存储在 Redis 的键值对中,键为商品编号,值为对应的库存数量。生成订单涉及到订单信息的构建和存储到 MySQL 数据库中。 以下是 Java 代码的实现: ```java import redis.clients.jedis.Jedis; import java.sql.*; public class OrderService { // Redis 连接信息 private static final String REDIS_HOST = "127.0.0.1"; private static final int REDIS_PORT = 6379; // MySQL 连接信息 private static final String MYSQL_URL = "jdbc:mysql://localhost:3306/mydatabase"; private static final String MYSQL_USERNAME = "root"; private static final String MYSQL_PASSWORD = "password"; public static void main(String[] args) { // 连接 Redis Jedis jedis = new Jedis(REDIS_HOST, REDIS_PORT); // 商品编号和购买数量 String productId = "123"; int quantity = 2; // 检查库存 int stock = Integer.parseInt(jedis.get(productId)); if (stock < quantity) { System.out.println("库存不足"); return; } // 生成订单 String orderId = generateOrderId(); String orderDate = getCurrentDate(); double totalAmount = calculateTotalAmount(productId, quantity); // 存储订单MySQL try { Connection conn = DriverManager.getConnection(MYSQL_URL, MYSQL_USERNAME, MYSQL_PASSWORD); String sql = "INSERT INTO orders (orderId, orderDate, productId, quantity, price, totalAmount) VALUES (?, ?, ?, ?, ?, ?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, orderId); pstmt.setString(2, orderDate); pstmt.setString(3, productId); pstmt.setInt(4, quantity); pstmt.setDouble(5, 12.34); // 假设商品单价为 12.34 pstmt.setDouble(6, totalAmount); pstmt.executeUpdate(); pstmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } // 更新库存 jedis.set(productId, String.valueOf(stock - quantity)); System.out.println("订单生成成功"); } // 生成订单号 private static String generateOrderId() { // 简单的实现,可以根据具体需求改进 return "ORDER" + System.currentTimeMillis(); } // 获取当前日期 private static String getCurrentDate() { // 简单的实现,可以根据具体需求改进 return "2022-01-01"; } // 计算总金额 private static double calculateTotalAmount(String productId, int quantity) { // 简单的实现,可以根据具体需求改进 return 12.34 * quantity; } } ``` 上述代码实现了以下功能: 1. 连接 Redis,并根据商品编号检查库存是否充足; 2. 生成订单号订单日期订单总金额; 3. 连接 MySQL 数据库,并将订单信息存储到订单表中; 4. 更新 Redis 中的库存信息,减去购买数量; 5. 打印订单生成成功的消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值