mysql数据库的流水号生成,数据库流水号生成解决方案

8d11a71f63d90ba28d6548a7fc223dc7.png

1.表结构

Field

Type

Comment

tm_sequence_id

bigint(20) NOT NULL

主键id

seq_name

varchar(30) NULL

序列名称

current_value

bigint(20) unsigned NULL

序列当前值

max_id

bigint(20) NULL

序列最大值(不填为数据类型的最大值)

cycle

smallint(6) NULL

0:默认不循环;1:循环

increment

int(10) unsigned NULL

增量(默认1)

remark

varchar(100) NULL

注释说明

2.索引

Indexes

Columns

Index Type

PRIMARY

tm_sequence_id

Unique

idx_seq_name

seq_name

Unique

3.建表语句(以下是mysql数据库执行脚本)

CREATE TABLE `tm_sequence` (

`tm_sequence_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘主键id’,

`seq_name` varchar(30) DEFAULT NULL COMMENT ‘序列名称’,

`current_value` bigint(20) unsigned DEFAULT ‘1’ COMMENT ‘序列当前值’,

`max_id` bigint(20) DEFAULT NULL COMMENT ‘序列最大值(不填为数据类型的最大值)’,

`cycle` smallint(6) DEFAULT ‘0’ COMMENT ‘0:默认不循环;1:循环’,

`increment` int(10) unsigned DEFAULT ‘1’ COMMENT ‘增量(默认1)’,

`remark` varchar(100) DEFAULT NULL COMMENT ‘注释说明’,

PRIMARY KEY (`tm_sequence_id`),

UNIQUE KEY `idx_seq_name` (`seq_name`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8 COMMENT=’序列表(实现mysql序列)’

4.获取序列号的流水数字值——2个函数FUNCTION

4.1 获取当前值

DELIMITER $$

DROP FUNCTION IF EXISTS `fn_seq_currval`$$

CREATE  FUNCTION `fn_seq_currval`(P_SEQ_NAME VARCHAR (30)) RETURNS BIGINT(20)

COMMENT ‘获取序列当前值’

BEGIN

DECLARE CURRVAL BIGINT ;

SELECT

CURRENT_VALUE INTO CURRVAL

FROM

TM_SEQUENCE T

WHERE SEQ_NAME = P_SEQ_NAME ;

RETURN CURRVAL ;

END$$

DELIMITER ;

4.2 获取下一个值,当前值加1

DELIMITER $$

DROP FUNCTION IF EXISTS `fn_seq_nextval`$$

CREATE  FUNCTION `fn_seq_nextval`(P_SEQ_NAME VARCHAR(30)) RETURNS BIGINT(20)

COMMENT ‘获取序列NEXT值’

BEGIN

UPDATE

TM_SEQUENCE

SET

CURRENT_VALUE = IF(

CYCLE = 0,

CURRENT_VALUE + INCREMENT,

CASE

WHEN CURRENT_VALUE + INCREMENT <= IFNULL(MAX_ID, – 1)

THEN CURRENT_VALUE + INCREMENT

ELSE 1

END

)

WHERE SEQ_NAME = P_SEQ_NAME ;

RETURN FN_SEQ_CURRVAL (P_SEQ_NAME) ;

END$$

DELIMITER ;

5.流水号拼接——字母加数字拼接定长流水号

DELIMITER $$

DROP FUNCTION IF EXISTS `fn_gen_batch_no`$$

CREATE FUNCTION `fn_gen_batch_no`(`P_HEAD_NAME` VARCHAR(20), `P_DATE` DATE) RETURNS VARCHAR(32) CHARSET utf8

COMMENT ‘获取发送批次号’

BEGIN

RETURN CONCAT(UPPER(CONCAT(RPAD(P_HEAD_NAME,4,’X’))),CONCAT(DATE_FORMAT(P_DATE,’%y%m%d’),LPAD(fn_seq_nextval(‘SEQ_PROCESS_NO’),10,0)));

END$$

DELIMITER ;