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实现类似Oracle的序列

MySQL实现类似Oracle的序列   Oracle一般使用序列(Sequence)来处理主键字段,而MySQL则提供了自增长(increment)来实现类似的目的; 但在实际使用...

MySQL实现类似Oracle的序列 - sequence

1. 介绍想要将varchar类型的数据作为主键,并要求能按自定义规则自增,这在MySQL是没有原生支持的但是想要模拟实现一个其实并不复杂,思路如下: 首先,定义一张表sequence,每一行记录...

一种实现mysql里自增序列的方法

最近工作中遇到一个需求,需要设计一个自增字段,当每插入一条记录的时候,该字段加1,但是由于种种原因,该字段无法作为primary key存在,这样就需要该字段实现为一个自增序列。 mysql中的aut...

MySQL实现类似Oracle的序列

Oracle一般使用序列(Sequence)来处理主键字段,而MySQL则提供了自增长(increment)来实现类似的目的; 但在实际使用过程中发现,MySQL的自增长有诸多的弊端:不能控制步长、开...

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

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

mycat 使用mysql实现全局序列号

mycat 及mysql 机器配置 http://blog.csdn.net/convict_eva/article/details/51858121 主   192.168.192.128 ...

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

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

MySQL实现序列(Sequence)效果

MySQL实现序列效果   一般使用序列(Sequence)来处理主键字段,在MySQL中是没有序列的,但是MySQL有提供了自增长(increment)来实现类似的目的,但也只是自增,而不能设置步长...

MySQL实现类似Oracle的序列

本文为网上看到原创,觉得有益,特粘贴保存。。。在此感想原创作者popoxxll

mysql实现自增序列

在项目中用mysql作数据库。id策略用mysql的自增长。但是有些表优化后进行了分区。导致无法设置主键自增长,因此自实现了一个id生成的序列。1.建了一张表存储表名和当前序列2.三种实现方式1)ja...
  • y_wave
  • y_wave
  • 2016-08-30 15:40
  • 2593
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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