`

MySQL增加Sequence管理功能

 
阅读更多

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

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

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

当前数据库为:mysql

由于mysql和oracle不太一样,不支持直接的sequence,所以需要创建一张table来模拟sequence的功能,理由sql语句如下:

第一步:创建--Sequence 管理表

Java代码  收藏代码
  1. DROP TABLE IF EXISTS sequence;  
  2. CREATE TABLE sequence (  
  3.          name VARCHAR(50) NOT NULL,  
  4.          current_value INT NOT NULL,  
  5.          increment INT NOT NULL DEFAULT 1,  
  6.          PRIMARY KEY (name)  
  7. ) ENGINE=InnoDB;  

 

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

Java代码  收藏代码
  1. DROP FUNCTION IF EXISTS currval;  
  2. DELIMITER $  
  3. CREATE FUNCTION currval (seq_name VARCHAR(50))  
  4.          RETURNS INTEGER  
  5.          LANGUAGE SQL  
  6.          DETERMINISTIC  
  7.          CONTAINS SQL  
  8.          SQL SECURITY DEFINER  
  9.          COMMENT ''  
  10. BEGIN  
  11.          DECLARE value INTEGER;  
  12.          SET value = 0;  
  13.          SELECT current_value INTO value  
  14.                    FROM sequence  
  15.                    WHERE name = seq_name;  
  16.          RETURN value;  
  17. END  
  18. $  
  19. DELIMITER ;  

 

第三步:创建--取下一个值的函数

Java代码  收藏代码
  1. DROP FUNCTION IF EXISTS nextval;  
  2. DELIMITER $  
  3. CREATE FUNCTION nextval (seq_name VARCHAR(50))  
  4.          RETURNS INTEGER  
  5.          LANGUAGE SQL  
  6.          DETERMINISTIC  
  7.          CONTAINS SQL  
  8.          SQL SECURITY DEFINER  
  9.          COMMENT ''  
  10. BEGIN  
  11.          UPDATE sequence  
  12.                    SET current_value = current_value + increment  
  13.                    WHERE name = seq_name;  
  14.          RETURN currval(seq_name);  
  15. END  
  16. $  
  17. DELIMITER ;  

 

第四步:创建--更新当前值的函数

Java代码  收藏代码
  1. DROP FUNCTION IF EXISTS setval;  
  2. DELIMITER $  
  3. CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)  
  4.          RETURNS INTEGER  
  5.          LANGUAGE SQL  
  6.          DETERMINISTIC  
  7.          CONTAINS SQL  
  8.          SQL SECURITY DEFINER  
  9.          COMMENT ''  
  10. BEGIN  
  11.          UPDATE sequence  
  12.                    SET current_value = value  
  13.                    WHERE name = seq_name;  
  14.          RETURN currval(seq_name);  
  15. END  
  16. $  
  17. 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语句查询下一个值,这样就解决了流水号唯一的问题。

贴出部分代码(已测试通过)

Java代码  收藏代码
  1. public void testGetSequence() {  
  2.     Connection conn = JDBCUtils.getConnection(url, userName, password);  
  3.     String sql = "SELECT CURRVAL('TestSeq');";  
  4.     PreparedStatement ptmt = null;  
  5.     ResultSet rs = null;  
  6.     try {  
  7.         ptmt = conn.prepareStatement(sql);  
  8.         rs = ptmt.executeQuery();  
  9.         int count = 0;  
  10.         while (rs.next()) {  
  11.             count = rs.getInt(1);  
  12.         }  
  13.         System.out.println(count);  
  14.     } catch (SQLException e) {  
  15.         e.printStackTrace();  
  16.     } finally {  
  17.         JDBCUtils.close(rs, ptmt, conn);  
  18.     }  
  19. }  

 

 

分享到:
评论

相关推荐

    java通过Mysql实现类似oracle序列功能序列.rar

    在MySQL中,定义一个存储过程如`GET_NEXT_SEQUENCE`,它会查询`sequence`表的最新`id`并增加1。 5. **Java调用存储过程**: - 使用`CallableStatement`对象,你可以调用MySQL的存储过程。设置参数和获取结果集,...

    MySQL的PPT文档

    - **MyISAM**:作为MySQL的默认引擎,提供了更多的索引和字段管理功能,支持表锁定机制来优化并发读写操作。但需要定期运行`OPTIMIZE TABLE`命令来回收空间,并且无法在表损坏后恢复数据。 - **HEAP**:适用于完全...

    Python库 | django_mysql-3.7.1-py3-none-any.whl

    对于后端开发人员来说,`django_mysql`不仅简化了Django与MySQL的集成,还通过增加额外的功能,使得在项目中使用MySQL变得更加灵活和高效。使用这个库,开发者可以更好地利用MySQL的特性,同时保持Django的优雅和...

    韩顺平j2ee-JDBC与MySQL学习笔记

    2. 将数据库驱动包(如MySQL的JDBC驱动)添加到项目的类路径中 为了演示JDBC的基本使用,我们可以通过一个简单的例子来了解。假设我们已经在Oracle数据库中创建了一个名为"user1"的表,包含id(主键,自增长)、...

    mysql_1.pdf

    - **添加新用户**: 需要在MySQL数据库的user表中插入新记录。例如: `CREATE USER 'briup'@'%' IDENTIFIED BY 'briup';`(允许任意主机连接) - **激活用户**: 执行 `FLUSH PRIVILEGES;` 来使用户权限生效。 - **设置...

    Oracle与MySQL的几点区别.docx

    Oracle 和 MySQL 是两种广泛使用的数据库管理系统,它们在很多方面有着显著的不同。以下是对标题和描述中提到的一些关键知识点的详细解释: 1. **组函数的使用**: - 在 MySQL 中,组函数(如 COUNT、SUM 等)可以...

    MariaDB 新版本实力逆袭不仅仅是 MySQL 替代品

    MariaDB,作为MySQL的一个分支,是由开源社区维护的数据库管理系统,采用GPL授权,旨在提供一个与MySQL兼容但更具创新性的选项。随着MariaDB 10.0的发布,它不仅被视为MySQL的替代品,更是对MySQL技术的进一步提升。...

    Sequence-Databases:用于创建和存储蛋白质 DNA 序列数据库的存储库

    总之,"Sequence-Databases"项目是一个综合性的解决方案,它结合了Python的灵活性和生物信息学的需求,旨在为科研人员提供一个高效、易用的序列数据库管理系统。通过学习和理解这个项目,我们可以深入探索序列数据...

    oracle数据库的功能

    5. **MySQL**:开源的关系型数据库管理系统,适用于小型到中型企业。易于安装和使用,拥有庞大的社区支持。 通过以上内容可以看出,Oracle数据库提供了丰富的功能和支持,使得其在企业级应用中占据了重要的地位。...

    专题23:Mysql 面试题(卷王专供+ 史上最全 + 2023面试必备)-V106-from-尼恩Java面试宝典.pdf

    MySQL日志管理 - **WAL (Write-Ahead Logging)**: - 一种日志先写机制,确保事务提交之前先将日志写入磁盘。 - 提高事务的持久性。 - **LSN (Log Sequence Number)**: - 日志序列号,用于标识日志记录的位置。 ...

    酒店管理系统

    数据库是存储和管理数据的核心组件,酒店管理系统通常采用关系型数据库,如MySQL或SQLite。数据库设计包括数据表的创建、字段定义和关系建立。例如,可以有"客户"表、"房间"表和"预订"表,它们之间通过主外键关联。...

    成绩管理系统需求分析.docx

    学生成绩管理系统的主要目标是高效、准确地管理学生的考试成绩,提供成绩录入、查询、统计和分析等功能。在需求分析阶段,首先要明确系统的目标用户,包括教师、学生、教务管理人员,以及可能的家长。对于教师,系统...

    AliSQL数据库开源功能特性.pdf

    阿里云的AliSQL数据库是一个基于MySQL的开源分支,旨在提供更高效、稳定和安全的数据存储解决方案。自2016年10月正式开源以来,AliSQL已经在社区中获得了广泛的关注和支持,其设计理念是回馈开源社区,从社区中汲取...

    mysql的增删改查总结面经.docx

    MySQL是世界上最流行的开源关系型数据库管理系统之一,其核心功能包括数据的增、删、改、查(CRUD)。本文将详细解析这些基本操作以及相关的数据库管理知识。 **增(Create)** - 插入数据:`INSERT INTO tab_name ...

    StrutsNews

    7.应要求添加了分页功能。 8.程序交流QQ:88190738,mail:ck-0123@163.com 作者:灵气 数据库表: create table news( newsid number primary key, title varchar2(20), content varchar2(1000), createdate ...

    Hive4——HIVE元数据库.pdf

    2. **ID管理**:Hive的`SEQUENCE_TABLE`暴露了对象ID的生成机制,每次创建新对象时,会更新ID并增加一定值。这与传统RDBMS的内部对象ID生成方式有所不同,后者通常对用户隐藏。 3. **数据字典**:Hive的数据字典...

    Mycat-server-1.6-RELEASE-20161028204710-linux.tar

    此外,Mycat还具备事务管理、SQL解析、安全控制等功能,兼容MySQL协议,因此可以无缝对接大部分使用MySQL的应用。 Mycat的标签“linux”表明了其在Linux环境下的适用性,而“Mycat”标签则明确了讨论的主题。在实际...

    循环向数据库添加数据

    - **使用批处理插入**:某些数据库支持一次插入多行数据的语法,如MySQL的`INSERT ... VALUES (...), (...), ...`。 - **并行处理**:利用多线程或多进程同时执行数据插入,但需注意数据一致性和并发控制。 综上所...

    关于oracleIP

    在Oracle数据库中,并不像MySQL那样直接支持自增字段的功能。但在实际的应用场景中,自增字段是非常有用的,尤其是在为表中的记录自动分配唯一标识符的情况下。因此,本文将详细介绍如何通过索引和触发器在Oracle...

Global site tag (gtag.js) - Google Analytics