oracle 模拟 mysql_Navicat for Mysql 模拟实现oracle sequence

一、问题背景

应用程序需要使用唯一的序列号,而多线程使得采用时间戳的方式生成该序列号的方式不可取(虽然冲突的可能性非常小),但mysql并没有oracle的sequence功能,通过mysql函数,简要实现下sequence功能。

注:本例详细介绍的是通过Navicat工具创建mysql函数,实现该自增序列功能,适合入门新手

1.新建数据库,创建保存序列号的表

0818b9ca8b590ca3270a3433284dd417.png

2.找到刚才新建的数据库,点击新建函数

2.1创建获取当前序列值的函数

设置传递参数

0818b9ca8b590ca3270a3433284dd417.png

设置返回值类型

0818b9ca8b590ca3270a3433284dd417.png

DECLARE value INTEGER;

SET value = 0;

SELECT trade_num INTO value

FROM trade_number

WHERE tag = tag;

RETURN value;

将上述获取当前序列号的代码片段copy到下图位置

0818b9ca8b590ca3270a3433284dd417.png

接下来,点击保存,输入函数名,不妨取名currentvalue

0818b9ca8b590ca3270a3433284dd417.png

2.2创建获取下一序列值的函数

设置传递参数

0818b9ca8b590ca3270a3433284dd417.png

设置返回值类型及大小

0818b9ca8b590ca3270a3433284dd417.png

UPDATE trade_number

SET trade_num = trade_num + increment

WHERE tag = tag;

RETURN currentvalue(tag);

编写函数体

0818b9ca8b590ca3270a3433284dd417.png

保存该函数,取名netvalue

2.3创建设置默认序列值的函数

参数的传递

0818b9ca8b590ca3270a3433284dd417.png

返回值类型

0818b9ca8b590ca3270a3433284dd417.png

函数体

UPDATE trade_number

SET trade_num = value

WHERE tag = tag;

RETURN currentvalue(tag);

保存该函数,取名setvalue

接下来,在数据库中插入一条默认值,比如,NO ,1000000,1

0818b9ca8b590ca3270a3433284dd417.png

测试:

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

后台代码的编写:

1、若用JDBC的方式访问数据库

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);

}

2、若用hibernate的方式访问数据库

try{

Session session = sessionFactory.getCurrentSession();

session.beginTransaction();

String sql = "SELECT NETVALUE('YRZYBS');";

List list=session.createSQLQuery(sql).list();

session.getTransaction().commit();

将获取的list进行处理....

}catch (Exception e){

e.printStackTrace();

}

至此,用Navicat的方式生成函数,模拟自增序列的任务完成了,也可以在命令行下进行函数的创建,此处不做叙述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值