MySQL函数生成订单编号

编号生成器基础方法

CREATE DEFINER=`root`@`localhost` FUNCTION `f_app_seq`(`in_seq_name` varchar(16)) RETURNS varchar(16) CHARSET utf8
BEGIN
/***************************************
*author felly
*date 2019年6月24日14:40:02
*业务序列产生器
*按天产生编号
*************************************/
DECLARE   v_d VARCHAR(16);
DECLARE  v_i INT(5);
DECLARE  app_no VARCHAR(16);
DECLARE   temp VARCHAR(16);

 set v_i=6;

set  v_d=right(DATE_FORMAT(now(),'%Y%m%d') ,6);
 
    UPDATE app_sequence SET seq_date=v_d,seq_value=0  WHERE seq_name=in_seq_name AND seq_date<>v_d;  

	 UPDATE app_sequence SET seq_value=last_insert_id(seq_value+1)  WHERE seq_name=in_seq_name;   

SET app_no= last_insert_id();   
SET app_no=LPAD(app_no,6,'0') ;
 
SET temp='';
WHILE  v_i>=0   DO
 SET  temp=CONCAT(temp,MID(v_d,6-v_i,1),MID(app_no,6-v_i,1));

SET v_i=v_i-1;
END WHILE;


RETURN  temp;
END

资金流水编号生成器

CREATE DEFINER=`root`@`localhost` FUNCTION `f_bill_no`() RETURNS varchar(16) CHARSET utf8
BEGIN
	/***************************************
*author felly
*date 2019年6月24日14:41:16
*主子订单编号产生器

*************************************/
declare  app_no varchar(16);

set app_no=f_app_seq('bill');
	RETURN concat('2',app_no);
END

订单编号生成器

CREATE DEFINER=`root`@`localhost` FUNCTION `f_order_no`() RETURNS varchar(16) CHARSET utf8
BEGIN
	/***************************************
*author felly
*date 2019年6月24日14:41:16
*主子订单编号产生器

*************************************/
declare  app_no varchar(16);

set app_no=f_app_seq('order');
	RETURN concat('1',app_no);
END

执行注意事项

三个函数需分步依次执行,不可在同一个执行中一次执行,会报错。

创建数据表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for app_sequence
-- ----------------------------
DROP TABLE IF EXISTS `app_sequence`;
CREATE TABLE `app_sequence`  (
  `seq_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '序列ID',
  `seq_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '序列名称',
  `seq_date` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '时间戳,格式%Y%m%d 后6位',
  `seq_value` int(11) NULL DEFAULT 0 COMMENT '序列值',
  `app_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '编号值',
  `func_info` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '描述',
  `created_at` timestamp(0) NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
  `updated_at` timestamp(0) NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '修改时间',
  PRIMARY KEY (`seq_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '流水序列表' ROW_FORMAT = Compact;

-- ----------------------------
-- Records of app_sequence
-- ----------------------------
INSERT INTO `app_sequence` VALUES (1, 'order', '190802', 2, NULL, '商城订单编号产生器', '0000-00-00 00:00:00', '0000-00-00 00:00:00');
INSERT INTO `app_sequence` VALUES (2, 'bill', '190704', 1, '', '交易流水编号产生器', '0000-00-00 00:00:00', '0000-00-00 00:00:00');

SET FOREIGN_KEY_CHECKS = 1;

执行select f_order_no()select f_bill_no() 即可发现编号逐渐递增且步长为1,可保证唯一性

********************只要思想不滑坡,办法总比困难多********************
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值