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,
  `order_num` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

创建触发器:

触发器主要代码

set new.order_num = concat(date_format(now(),‘%y%m%d%i‘),(select LPAD(IFNULL(max(id),0)+1,11,0) FROM qs_test))

触发器全部代码

CREATE DEFINER = `root`@`%` TRIGGER `insert_value_add` BEFORE INSERT ON `qs_test` FOR EACH ROW set new.order_num = concat(date_format(now(),‘%y%m%d%i‘),(select LPAD(IFNULL(max(id),0)+1,11,0) FROM qs_test)) ;

原文地址:https://www.cnblogs.com/hardykay/p/12015758.html

时间: 2024-08-01 15:08:28

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使用过程存储生成唯一订单号

数据库表: /* 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:

生成唯一订单号 (支持每秒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));