【第22期】观点:IT 行业加班,到底有没有价值?

mysql 实现序列功能

原创 2016年08月29日 15:34:13

概述

DB2和oracle数据库自带了sequence功能,可以很方便就能取到序列号,mysql为实现这一功能,通过以下步骤实现:

1.创建表,存储sequence的数据,每一行代表一个sequence数据:

序列名称(sequence name):名称需要唯一,代表每一个序列逻辑
当前值( current_value):通过update current_value =current_value+increment,让当前值增长
增长步长(increment):增加量
循环最大值(max_value):序列达到最大值后,可通过重置初始值,重新开始

DROP TABLE IF EXISTS sequence;

CREATE TABLE sequence (
    NAME VARCHAR (50) NOT NULL COMMENT '序列名称',
    current_value INT NOT NULL DEFAULT 0 COMMENT '当前值',
    increment INT NOT NULL DEFAULT 1 COMMENT '增量',
    max_value INT DEFAULT 0 COMMENT '最大值,循环序列,默认0不循环',
    PRIMARY KEY (NAME)
) ENGINE = INNODB;

2.获取当前值函数

DROP FUNCTION IF EXISTS currval; 
DELIMITER $ 
CREATE FUNCTION currval (seq_name VARCHAR(50)) 
     RETURNS INTEGER 
     LANGUAGE SQL 
     DETERMINISTIC 
     CONTAINS SQL 
     SQL SECURITY DEFINER 
     COMMENT '取当前值的函数' 
BEGIN 
     SELECT current_value INTO @v FROM sequence WHERE name = seq_name; 
     RETURN @v; 
END 
$ DELIMITER ;

3.获取下一个值的函数

DROP FUNCTION IF EXISTS nextval; 
DELIMITER $ 
CREATE FUNCTION nextval (seq_name VARCHAR(50)) 
    RETURNS INTEGER 
    LANGUAGE SQL 
    DETERMINISTIC 
    CONTAINS SQL 
    SQL SECURITY DEFINER 
    COMMENT '取下一个值的函数' 
BEGIN 

    SELECT max_value INTO @max_v from sequence where name = seq_name limit 1;
    UPDATE sequence SET current_value = current_value + increment WHERE name = seq_name; 
    SET @v = currval(seq_name);

    IF @max_v > 0 AND @v > @max_v THEN
        RETURN setval('cmb_bill_num', 1);
    ELSE
        RETURN @v;
    END IF;
END 
$ DELIMITER ; 

4.更新当前值的函数

DROP FUNCTION IF EXISTS setval; 
DELIMITER $ 
CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER) 
RETURNS INTEGER 
    LANGUAGE SQL 
    DETERMINISTIC 
    CONTAINS SQL 
    SQL SECURITY DEFINER 
    COMMENT '更新当前值的函数' 
BEGIN 
    UPDATE sequence SET current_value = value WHERE name = seq_name; 
    RETURN currval(seq_name); 
END 
$ DELIMITER ; 

5.测试

mysql> insert into sequence (NAME, current_value, max_value) values ( 'test' , 0, 999999);
Query OK, 1 row affected (0.00 sec)

mysql> select nextval('test');
+-----------------+
| nextval('test') |
+-----------------+
|               1 |
+-----------------+
1 row in set (0.00 sec)

mysql> select nextval('test');
+-----------------+
| nextval('test') |
+-----------------+
|               2 |
+-----------------+
1 row in set (0.00 sec)
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

在MySQL中创建实现自增的序列(Sequence)的教程

项目应用中,曾有以下一个场景: 接口中要求发送一个int类型的流水号,由于多线程模式,如果用时间戳,可能会有重复的情况(当然概率很小)。 所以想到了利用一个独立的自增的sequence来解决该问题...

mysql实现oracle序列(sequence)的解决方案--自定义存储过程

转自:http://g.kehou.com/t1018529793.html MySQL自增长与Oracle序列的区别: 自增长只能用于表中的其中一个字段 自增长只能被分配给固定表的固定的某一字段,不能被多个表共用. 自增长会把一个未指定或NULL值的字段自动填上. 在mysq...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

在MongoDB里实现循环序列功能

环境是这样的:服务器是用Java做的, 数据库是MongoDB   需求是这样的:我们的系统里要生成一个唯一ID,前面的部分有一定的格式,并和时间关联, 精确到微秒,考虑到同一微秒内有可能存在并发情况, 所以后面在加两位序列号, 系统需要定义为1毫秒内的并发小于100个,所以后面两位就...

在Delphi中用拼音首字符序列来实现检索功能

在日常工作和生活中我们经常使用电子记事本查找个人通讯录信息,或在单位的应用程序中查询客户档案或业务资料,这个过程中往往需要输入大量的汉字信息,对于熟悉计算机的人这已经是一件头疼的事,那些不太熟悉计算机...

mysql使用触发器或函数实现自增序列

转自:http://foolraty.iteye.com/blog/777215 http://www.blogjava.net/Skynet/archive/2011/03/23/301847.
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)