create table sequence (  
    seq_name        VARCHAR(50)  NOT NULL COMMENT '序列名称',
    min_val         INT  UNSIGNED         NOT NULL COMMENT '最小值',
    max_val         INT  UNSIGNED         NOT NULL COMMENT '最大值',
    if_cycle        INT  UNSIGNED         NOT NULL COMMENT '是否循环',
    if_use          INT  UNSIGNED         NOT NULL COMMENT '是否使用中:0:未使用,1:已使用',
    current_val     INT  UNSIGNED         NOT NULL COMMENT '当前值',
    increment_val   INT  UNSIGNED         NOT NULL DEFAULT 1 COMMENT '步长(跨度)',
    PRIMARY KEY (seq_name)
);

delimiter $$

create function currval(v_seq_name VARCHAR(50))  
returns integer
begin
    declare v_curr_val integer;  
    set v_curr_val := 0;  
    select current_val into v_curr_val  
    from sequence
    where seq_name = v_seq_name;  
    return v_curr_val;  
end$$

create function nextval(v_seq_name VARCHAR(50))
returns INTEGER
begin
    declare v_curr_val INTEGER;
    declare v_increment_val INTEGER;
    declare v_if_cycle INTEGER;
    declare v_next_val INTEGER;
    declare v_min_val INTEGER;
    declare v_max_val INTEGER;

update sequence set if_use = 1 where seq_name = v_seq_name;
    select current_val, min_val, max_val, increment_val, if_cycle
    into v_curr_val, v_min_val, v_max_val, v_increment_val, v_if_cycle from sequence where seq_name = v_seq_name;
    set v_next_val := v_curr_val + v_increment_val;
    if (v_next_val > v_max_val) and (v_if_cycle = 0) then
        set v_next_val := -1;
    else
        set v_next_val := mod(v_next_val, v_max_val + 1);
        IF v_next_val < v_min_val then
            set v_next_val := v_min_val;
        end if;
        update sequence set current_val = v_next_val where seq_name = v_seq_name;   
    end if;  
    update sequence set if_use = 0 where seq_name = v_seq_name;   
    return v_next_val;
end$$

create function setval(v_seq_name VARCHAR(50), v_new_val INTEGER)  
returns integer
begin
    declare v_min_val int;
    declare v_max_val int;
    update sequence set if_use = 1 where seq_name = v_seq_name;    
    select min_val, max_val into v_min_val, v_max_val from sequence where seq_name = v_seq_name;
    if (v_new_val > v_max_val) or (v_new_val < v_min_val) then
        set v_new_val := -1;
    else
        update sequence set current_val = v_new_val where seq_name = v_seq_name;
    end if;
    update sequence set if_use = 0 where seq_name = v_seq_name;
    return v_new_val;
end$$

delimiter ;

msql 实现sequence功能增强的更多相关文章

  1. MWeb 1.4 新功能介绍二:静态博客功能增强

    MWeb 比较有特色的是一键生成静态博客功能,然后从 MWeb 最开始规划要做静态博客生成功能时,我就希望 MWeb 的静态博客生成功能在易用的同时,还要有很强大的扩展性. 比如说能自己增加网站公告, ...

  2. VMare中安装“功能增强工具”,实现CentOS5.5与win7host共享文件夹的创建

    读者如要转载,请标明出处和作者名,谢谢. 地址01:http://space.itpub.net/25851087 地址02:http://www.cnblogs.com/zjrodger/ 地址03 ...

  3. Java SE 5.0 - SE 8 的功能增强

    Table of Contents 前言 Java 5.0 Generics Enhanced for Loop Autoboxing Typesafe Enums Varargs Static Im ...

  4. jquery-7 jquery中的文档处理方法有哪些(方法的参数表示功能增强)

    jquery-7 jquery中的文档处理方法有哪些(方法的参数表示功能增强) 一.总结 一句话总结:多看参考文档,多看主干目录.一般的功能分两个方法来实现,一个对应标签,一个对应标签和事情,比如克隆 ...

  5. DevExpress WPF v19.1:Data Grid/Tree List等控件功能增强

    行业领先的.NET界面控件DevExpress 日前正式发布v19.1版本,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WPF v19.1中新增的一些控件及部 ...

  6. DevExpress WinForms v19.1新版亮点:Spreadsheet/Sunburst控件功能增强

    行业领先的.NET界面控件DevExpress v19.1终于正式发布,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WinForms v19.1中新增的一些控 ...

  7. Kubernetes 弹性伸缩HPA功能增强Advanced Horizontal Pod Autoscaler -介绍部署篇

    背景 WHAT(做什么) Advanced Horizontal Pod Autoscaler(简称:AHPA)是kubernetes中HPA的功能增强. 在兼容原生HPA功能基础上,增加预测.执行模 ...

  8. Tapdata Cloud 版本上新!新增TiDB等数据源支持,连接和任务功能增强,体验更优

    Tapdata Cloud cloud.tapdata.net Tapdata Cloud 是国内首家异构数据库实时同步云平台,目前支持Oracle.MySQL.PG.SQL Server.Mongo ...

  9. ORACLE 12C RMAN 功能增强

    在ORACLE 12C中对rman的功能有了不少增强,在以前的文章中写过RMAN RECOVER TABLE功能,这里另外补充rman增强的两个小功能(sql语句和数据文件分割)数据库版本 SQL&g ...

随机推荐

  1. MySQL 插入数据 通过命令提示窗口插入数据

    MySQL 表中使用 INSERT INTO SQL语句来插入数据. 你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据. 语法 以下为向MySQL数据表插 ...

  2. 用Merge来改写相关更新的例子

    下面的两个SQL是等价的,但是一个执行N小时都执行不完,一个花了一分钟. 执行计划显示第一个语句是由外面的即将被更新的表驱动内层,相对于是一个NEST LOOP,cost非常大.第二个语句是内层单独执 ...

  3. JavaScript编码规范指南

    前言 本文摘自Google JavaScript编码规范指南,截取了其中比较容易理解与遵循的点作为团队的JavaScript编码规范. JavaScript 语言规范 变量 声明变量必须加上 var  ...

  4. Swift 2.x -> Swift 3.0

    Swift 3.0 相对于 2.x 有很大变化.特别是因为命名习惯的改变,导致许多 Api 都发生了变化.总的趋势是让表示更简洁. 对旧的代码升级,大部分可以根据提示来进行更正.但也有的需要手动修改. ...

  5. Redmine新建问题速度慢

    Redmine有时候新建问题 ,更新指派人的时候反应很慢, 很大原因应该是发送邮件方式不对. 1.一种方式是改为异步发送      2.另外检测到Redmine日志 ,会发现发送邮件失败 ,也会导致发 ...

  6. [CC]点云密度计算

    包括两种计算方法:精确计算和近似计算(思考:local density=单位面积的点数 vs  local density =1/单个点所占的面积) 每种方法可以实现三种模式的点云密度计算,CC里面的 ...

  7. javascript中的正则表达式学习

    一.前言 关于正则表达式自身的语法这里不做过多介绍(详情可参见http://www.php100.com/manual/unze.html),这里仅仅解释javascript中和正则表达式相关的几个方 ...

  8. Redhat 7 或者 CentOS 7 密码破解

    1.在如下界面按 e 2.在 linux16 这一行的最后面添加 rd.break,然后按 ctrl + x 进入单用户模式 3.以读写的方式重新挂载 sysroot 4.切换到 sysroot 目录 ...

  9. delphi 导出xml文件

    procedure TfrmTallageDetail.ToolButton1Click(Sender: TObject); var Xml: TXMLDocument; Rootbusiness,R ...

  10. javascript sandbox

    用途 https://github.com/gf3/sandbox Can be used to execute untrusted code. Support for timeouts (e.g. ...