1、oracel可以直接支持sequence,但是mysql不支持sequence,因此我们要通过模拟sequence的方法在mysql中创建sequence。
模拟sequence的方法:
项目场景:
项目应用中,曾有以下一个场景:

接口中要求发送一个int类型的流水号,由于多线程模式,如果用时间戳,可能会有重复的情况(当然概率很小)。

所以想到了利用一个独立的自增的sequence来解决该问题。

当前数据库为:mysql

由于mysql和oracle不太一样,不支持直接的sequence,所以需要创建一张table来模拟sequence的功能,sql语句如下:
第一步:创建--Sequence 管理表
    DROP TABLE IF EXISTS sequence;  
    CREATE TABLE sequence (  
             name VARCHAR(50) NOT NULL,  
             current_value INT NOT NULL,  
             increment INT NOT NULL DEFAULT 1,  
             PRIMARY KEY (name)  
    ) ENGINE=InnoDB;

第二步:创建--取当前值的函数
    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  
             DECLARE value INTEGER;  
             SET value = 0;  
             SELECT current_value INTO value  
                       FROM sequence  
                       WHERE name = seq_name;  
             RETURN value;  
    END  
    $  
    DELIMITER ;

第三步:创建--取下一个值的函数
    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  
             UPDATE sequence  
                       SET current_value = current_value + increment  
                       WHERE name = seq_name;  
             RETURN currval(seq_name);  
    END  
    $  
    DELIMITER ;

第四步:创建--更新当前值的函数
    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 ;

第五步:测试函数功能
当上述四步完成后,可以用以下数据设置需要创建的sequence名称以及设置初始值和获取当前值和下一个值。

INSERT INTO sequence VALUES ('TestSeq', 0, 1);----添加一个sequence名称和初始值,以及自增幅度
SELECT SETVAL('TestSeq', 10);---设置指定sequence的初始值
SELECT CURRVAL('TestSeq');--查询指定sequence的当前值
SELECT NEXTVAL('TestSeq');--查询指定sequence的下一个值

在java代码中,可直接创建sql语句查询下一个值,这样就解决了流水号唯一的问题。

贴出部分代码(已测试通过)
    public void testGetSequence() {  
        Connection conn = JDBCUtils.getConnection(url, userName, password);  
        String sql = "SELECT CURRVAL('TestSeq');";  
        PreparedStatement ptmt = null;  
        ResultSet rs = null;  
        try {  
            ptmt = conn.prepareStatement(sql);  
            rs = ptmt.executeQuery();  
            int count = 0;  
            while (rs.next()) {  
                count = rs.getInt(1);  
            }  
            System.out.println(count);  
        } catch (SQLException e) {  
            e.printStackTrace();  
        } finally {  
            JDBCUtils.close(rs, ptmt, conn);  
        }  
    }

ps:在应用中,还有一种用java代码去实现模拟自增sequence的方式,具体思路是创建一张存放sequence的table,然后通过java调用sql语句去查询和修改这个table中指定sequence名称的值,这种方式请加上synchronized。具体代码这里就不上传了,因为实现了,未去测试过。

【转】MySQL中增加sequence管理功能(模拟创建sequence)的更多相关文章

  1. JOffice中的权限管理--功能粒度的权限管理配置

    JOffice中的权限管理是基于角色的管理策略,采用Spring Security2的配置方式,同时能够结合EXT3来进行整个系统的权限管理,通过使用配置文件,进行整个系统的功能集中管理,包括系统左边 ...

  2. elasticsearch 7.x 如何满足mysql中的模糊查询功能(like)

    业务场景:筛选项原功能是用mysql左模糊进行过滤查询,现业务要用es,怎么样才能满足原功能,又不损性能. elasticsearch中有关于模糊查询的操作:wildcard 文档:https://b ...

  3. VuePress 中增加用户登录功能

    在 VuePress 中增加用户登录 VuePress 是 Vuejs 官方提供的一个快速建设文档站点的工具,在简单配置好功能后,需要做的事情就剩下写好一个个 Markdown 文档. 因为 VueP ...

  4. sql server和mysql中分别实现分页功能

    MySQL 在MySQL中,可以用 Limit 来查询第 m 列到第 n 列的记录, 例如: select * from tablename limit m, n sql="select * ...

  5. mysql中增加某一时间段内的时间数据(包含:时间、年、月、日、第几周、季度)

    创建表dim_date: create table `dim_date` ( `year` int (20), `month` int (20), `day` int (20), `week` int ...

  6. Django Admin中增加导出Excel功能

    参考: https://www.cnblogs.com/yoyo008/p/9232805.html 在使用Django Admin时, 对于列表我们有时需要提供数据导出功能, 如下图: 在Djang ...

  7. Django Admin中增加导出CSV功能

    参考: https://books.agiliq.com/projects/django-admin-cookbook/en/latest/export.html 在使用Django Admin时, ...

  8. 如何在MySQL中增加一列

    如果想在一个已经建好的表中添加一列,可以使用诸如: alter table TABLE_NAME add column NEW_COLUMN_NAME varchar(255) not null; 这 ...

  9. MySql中增加一列

    如果想在一个已经建好的表中添加一列,可以用诸如: alter table TABLE_NAME add column NEW_COLUMN_NAME varchar(20) not null; 这条语 ...

随机推荐

  1. ORACLE建表练习

    1,学生表 -- Create table create table T_HQ_XS ( xueh ) not null, xingm ) not null, xingb ) ', nianl NUM ...

  2. iOS开发小技巧--利用运行时得到隐藏的成员变量

    一.关于运行时,已经从网络上摘抄了一片文章,这里只有项目中自己的简单使用 -- 查找隐藏的成员变量 导入头文件 可以获得隐藏的成员变量,方法,属性等 代码: 打印效果图:

  3. SQL-Server 创建数据库,创建表格

    use master --使用master权限 create database E_Market--创建新数据库 on primary--指定主数据文件,有且只有一个 ( name='E_Market ...

  4. hive 使用笔记(partition; HDFS乱码)

    6.  insert 语句 1) 因为目标表有partition, 所以刚开始我使用的语句是 insert overwrite table sa_r_item_sales_day_week_month ...

  5. BZOJ-2748 音量调节 DP+背包(脑残)

    水DP,一开始竟然想错了...水了半天....真可怕 2748: [HAOI2012]音量调节 Time Limit: 3 Sec Memory Limit: 128 MB Submit: 1156 ...

  6. 移动H5页面,keyup事件不好使用处理解决

    1.mouse事件换成touch,pointer事件,keyup换成textInput事件

  7. TYVJ1038 忠诚

    hzw学长博客里的2048,根本停不下来! 描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要 求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意. ...

  8. python TypeError: 'str' object does not support item assignment”

    想替换string里的空格,遍历替换提示如题错误,查询得知string类型不可更改 import string s = "2013/2/12" b = s.replace('/', ...

  9. 类,抽象基类,接口类三者间的区别与联系(C++)

    结构上的区别: 普通类:数据+方法+实现 抽象类:数据+方法(一定包含虚方法n>=1)+部分方法的实现 接口类:方法(纯虚方法) http://www.cnblogs.com/Tris-wu/p ...

  10. mysql语句分析

    explain的每个输出行提供一个表的相关信息,并且每个行包括下面的列: 1,id   select识别符.这是select的查询序列号.2,select_type 可以为一下任何一种类型simple ...