Navicat for Mysql 模拟实现oracle sequence

一、问题背景

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

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


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

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

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

设置传递参数

Navicat for Mysql 模拟实现oracle sequence_第1张图片

设置返回值类型

Navicat for Mysql 模拟实现oracle sequence_第2张图片

	DECLARE value INTEGER;  
         SET value = 0;  
         SELECT trade_num INTO value  
                   FROM trade_number  
                   WHERE tag = tag;  
         RETURN value; 

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

Navicat for Mysql 模拟实现oracle sequence_第3张图片

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

Navicat for Mysql 模拟实现oracle sequence_第4张图片

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

设置传递参数

Navicat for Mysql 模拟实现oracle sequence_第5张图片

设置返回值类型及大小

Navicat for Mysql 模拟实现oracle sequence_第6张图片

	UPDATE trade_number  
                   SET trade_num = trade_num + increment  
                   WHERE tag = tag;  
         RETURN currentvalue(tag);

编写函数体

Navicat for Mysql 模拟实现oracle sequence_第7张图片

保存该函数,取名netvalue

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

参数的传递

Navicat for Mysql 模拟实现oracle sequence_第8张图片

返回值类型

Navicat for Mysql 模拟实现oracle sequence_第9张图片

函数体

		UPDATE trade_number  
                   SET trade_num = value
                   WHERE tag = tag;  
         RETURN currentvalue(tag);

保存该函数,取名setvalue

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

测试:

Navicat for Mysql 模拟实现oracle sequence_第10张图片

Navicat for Mysql 模拟实现oracle sequence_第11张图片

后台代码的编写:

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的方式生成函数,模拟自增序列的任务完成了,也可以在命令行下进行函数的创建,此处不做叙述



你可能感兴趣的:(Mysql)