项目应用中,曾有以下一个场景:
接口中要求发送一个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中,定义一个存储过程如`GET_NEXT_SEQUENCE`,它会查询`sequence`表的最新`id`并增加1。 5. **Java调用存储过程**: - 使用`CallableStatement`对象,你可以调用MySQL的存储过程。设置参数和获取结果集,...
- **MyISAM**:作为MySQL的默认引擎,提供了更多的索引和字段管理功能,支持表锁定机制来优化并发读写操作。但需要定期运行`OPTIMIZE TABLE`命令来回收空间,并且无法在表损坏后恢复数据。 - **HEAP**:适用于完全...
对于后端开发人员来说,`django_mysql`不仅简化了Django与MySQL的集成,还通过增加额外的功能,使得在项目中使用MySQL变得更加灵活和高效。使用这个库,开发者可以更好地利用MySQL的特性,同时保持Django的优雅和...
2. 将数据库驱动包(如MySQL的JDBC驱动)添加到项目的类路径中 为了演示JDBC的基本使用,我们可以通过一个简单的例子来了解。假设我们已经在Oracle数据库中创建了一个名为"user1"的表,包含id(主键,自增长)、...
- **添加新用户**: 需要在MySQL数据库的user表中插入新记录。例如: `CREATE USER 'briup'@'%' IDENTIFIED BY 'briup';`(允许任意主机连接) - **激活用户**: 执行 `FLUSH PRIVILEGES;` 来使用户权限生效。 - **设置...
Oracle 和 MySQL 是两种广泛使用的数据库管理系统,它们在很多方面有着显著的不同。以下是对标题和描述中提到的一些关键知识点的详细解释: 1. **组函数的使用**: - 在 MySQL 中,组函数(如 COUNT、SUM 等)可以...
MariaDB,作为MySQL的一个分支,是由开源社区维护的数据库管理系统,采用GPL授权,旨在提供一个与MySQL兼容但更具创新性的选项。随着MariaDB 10.0的发布,它不仅被视为MySQL的替代品,更是对MySQL技术的进一步提升。...
总之,"Sequence-Databases"项目是一个综合性的解决方案,它结合了Python的灵活性和生物信息学的需求,旨在为科研人员提供一个高效、易用的序列数据库管理系统。通过学习和理解这个项目,我们可以深入探索序列数据...
5. **MySQL**:开源的关系型数据库管理系统,适用于小型到中型企业。易于安装和使用,拥有庞大的社区支持。 通过以上内容可以看出,Oracle数据库提供了丰富的功能和支持,使得其在企业级应用中占据了重要的地位。...
MySQL日志管理 - **WAL (Write-Ahead Logging)**: - 一种日志先写机制,确保事务提交之前先将日志写入磁盘。 - 提高事务的持久性。 - **LSN (Log Sequence Number)**: - 日志序列号,用于标识日志记录的位置。 ...
数据库是存储和管理数据的核心组件,酒店管理系统通常采用关系型数据库,如MySQL或SQLite。数据库设计包括数据表的创建、字段定义和关系建立。例如,可以有"客户"表、"房间"表和"预订"表,它们之间通过主外键关联。...
学生成绩管理系统的主要目标是高效、准确地管理学生的考试成绩,提供成绩录入、查询、统计和分析等功能。在需求分析阶段,首先要明确系统的目标用户,包括教师、学生、教务管理人员,以及可能的家长。对于教师,系统...
阿里云的AliSQL数据库是一个基于MySQL的开源分支,旨在提供更高效、稳定和安全的数据存储解决方案。自2016年10月正式开源以来,AliSQL已经在社区中获得了广泛的关注和支持,其设计理念是回馈开源社区,从社区中汲取...
MySQL是世界上最流行的开源关系型数据库管理系统之一,其核心功能包括数据的增、删、改、查(CRUD)。本文将详细解析这些基本操作以及相关的数据库管理知识。 **增(Create)** - 插入数据:`INSERT INTO tab_name ...
7.应要求添加了分页功能。 8.程序交流QQ:88190738,mail:ck-0123@163.com 作者:灵气 数据库表: create table news( newsid number primary key, title varchar2(20), content varchar2(1000), createdate ...
2. **ID管理**:Hive的`SEQUENCE_TABLE`暴露了对象ID的生成机制,每次创建新对象时,会更新ID并增加一定值。这与传统RDBMS的内部对象ID生成方式有所不同,后者通常对用户隐藏。 3. **数据字典**:Hive的数据字典...
此外,Mycat还具备事务管理、SQL解析、安全控制等功能,兼容MySQL协议,因此可以无缝对接大部分使用MySQL的应用。 Mycat的标签“linux”表明了其在Linux环境下的适用性,而“Mycat”标签则明确了讨论的主题。在实际...
- **使用批处理插入**:某些数据库支持一次插入多行数据的语法,如MySQL的`INSERT ... VALUES (...), (...), ...`。 - **并行处理**:利用多线程或多进程同时执行数据插入,但需注意数据一致性和并发控制。 综上所...
在Oracle数据库中,并不像MySQL那样直接支持自增字段的功能。但在实际的应用场景中,自增字段是非常有用的,尤其是在为表中的记录自动分配唯一标识符的情况下。因此,本文将详细介绍如何通过索引和触发器在Oracle...