项目应用中,曾有以下一个场景:

接口中要求发送一个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;

欢迎大家阅读《MySQL增多Sequence管理功能》,跪求各位点评,by 搞代码

第二步:创建--取当前值的函数

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_MySQL增多Sequence管理功能相关推荐

  1. mysql sequence java_MySQL增加Sequence管理功能

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

  2. 给 MySQL 增加 Sequence 管理功能

    -- Sequence 管理表 DROP TABLE IF EXISTS sequence; CREATE TABLE sequence ( name VARCHAR(50) NOT NULL, cu ...

  3. mysql怎么用sequence_mysql实现sequence功能的代码

    mysql实现sequence功能 1.建立sequence记录表 CREATE TABLE `sys_sequence` ( `seq_name` varchar(50) CHARACTER SET ...

  4. php学生成绩管理系统,数据库使用MySQL,包括源代码和数据库SQL文件,具有学生和教师登录管理功能

    php学生成绩管理系统,数据库使用MySQL,包括源代码和数据库SQL文件,具有学生和教师登录管理功能 数据库SQL文件 /*Navicat Premium Data TransferSource S ...

  5. SSM框架+VUE+Mysql实现的疫苗预约接种管理系统(功能包含分角色,登录/注册、疫苗管理、接种点管理、用户管理、疫苗类型管理、我的预约、预约接种管理、关于等)

    博客目录 SSM框架+VUE+Mysql实现的疫苗预约接种管理系统 实现功能截图 系统功能 使用技术 代码 完整源码 SSM框架+VUE+Mysql实现的疫苗预约接种管理系统 本系统为了解决疫苗线下预 ...

  6. mysql中外键的作用是什么_mysql外键基本功能与用法详解

    本文实例讲述了mysql外键基本功能与用法.分享给大家供大家参考,具体如下: 本文内容: 什么是外键 外键的增加 外键的修改和删除 外键的约束模式 首发日期:2018-04-12 什么是外键: 外键就 ...

  7. SSM+Mysql实现的共享单车管理系统(功能包含分角色,登录、用户管理、服务点管理、单车管理、分类管理、学生信息管理、单车租赁、信息统计、系统设置等)

    博客目录 SSM+Mysql实现的共享单车管理系统 实现功能截图 系统功能 使用技术 代码 完整源码 SSM+Mysql实现的共享单车管理系统 本系统一个学校共享单车管理的项目,通过线上系统化的管理, ...

  8. SSM框架(spring+springmvc+mybatis)+Mysql实现的社区物业管理系统(功能包含分角色,报修管理、抄表管理、车位管理、房屋管理、业主管理、投诉管理、报修统计分析等)

    博客目录 SSM框架(spring+springmvc+mybatis)+Mysql实现的社区物业管理系统 实现功能截图 系统功能 使用技术 代码 完整源码 SSM框架(spring+springmv ...

  9. Javawebservlet+Mysql实现的化妆品售卖系统(功能包含分角色,登录/注册、化妆品列表/商品详情/加入购物车/订单结算付款/地址管理/后台权限管理/商品管理/订单列表等)

    博客目录 Javawebservlet+Mysql实现的化妆品售卖系统 实现功能截图 系统功能 使用技术 代码 完整源码 Javawebservlet+Mysql实现的化妆品售卖系统 本系统为了解决化 ...

最新文章

  1. shell判断false_Python中的True, False条件判断
  2. 大数据集群问题排查:时间不同步导致hbase regionserver只启动了部分节点的进程
  3. 《中国人工智能学会通讯》——11.65 双重代价敏感的属性分类模型
  4. HBase+Phoenix整合入门--集群搭建
  5. linux 编写完程序吗,linux下编写C++程序
  6. linux 如何查看进程内用户虚拟空间分布
  7. 简单api_GraphQL API集成的简要介绍
  8. UNICODE与ANSI的区别
  9. GCD学习(五) dispatch_barrier_async
  10. 管理感悟:听明白不容易
  11. 个性化推荐系统实践应用
  12. Excel合并多个文件
  13. 移动硬盘使用时间、读写速度和坏道查询
  14. 守望先锋游戏反外挂技术测评
  15. 2020大学研究生计算机排名,美国大学研究生计算机专业排名2020情况如何?
  16. 数据结构实训《表达式求值》
  17. OKRs-E 让目标推进成功率提升200%
  18. 2022全国大学生物联网设计竞赛火热开启,限量礼品等你来拿
  19. 基于java实现bilibili视频爬虫
  20. 从360大战QQ看未来云计算和云存储

热门文章

  1. C学习笔记-基础数据结构与算法
  2. 第四周笔记 c++ Boolan
  3. Java 文件操作-RandomAccessFile
  4. 备份自己的myeclipse快捷键到需要的环境
  5. android studio使用ndk,jni随记
  6. 今日心得:人生就像一杯茶,不会苦一辈子但会苦一阵子
  7. VS中使用define和undef实现条件编译(csc.exe条件编译)
  8. Junit 测试时内存溢出解决办法
  9. java 调用php文件上传_php上传文件,接口是java,go。
  10. 忘却的旋律java2_[17-8-10]【复杂问题】打不开游戏