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 ;

MYSQL的客户端sqlyog版本12-可以还原会话

MYSQL的客户端sqlyog版本-12 可以还原客户端回话,恢复上次的脚本。 以下链接版本为64位操作系统。 链接: https://pan.baidu.com/s/1smTgPxb 密码: z9mc ...

阅读全文

MySQL增加新分区语句

— 查看分区值 select TO_DAYS(‘2017-12-01’); — MAXVALUE分区重建分区 ALTER TABLE tt_tableName  REORGANIZE PARTITION p_catch_al...

阅读全文

MySql存储过程—游标(Cursor)

1、游标的作用及属性 游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作;游标有下面这些属性:   a、游标是只读的,也就是不能...

阅读全文

欢迎留言