编号生成器基础方法
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,可保证唯一性