数据库教程:在MySQL中创建实现自增的序列(Sequence)的教程分享

项目应用中,曾有以下一个场景:
接口中要求发送一个int类型的流水号,由于多线程模式,如果用时间戳,可能会有重复的情况(当然概率很小)。
所以想到了利用一个独立的自增的sequence来解决该问题。
当前数据库为:mysql
由于mysql和oracle不太一样,不支持直接的sequence,所以需要创建一张table来模拟sequence的功能,理由sql语句如下:
第一步:创建–Sequence管理表

DROPTABLEIFEXISTSsequence; CREATETABLEsequence( nameVARCHAR(50)NOTNULL, current_valueINTNOTNULL, incrementINTNOTNULLDEFAULT1, PRIMARYKEY(name) )ENGINE=InnoDB;

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

DROPFUNCTIONIFEXISTScurrval; DELIMITER$ CREATEFUNCTIONcurrval(seq_nameVARCHAR(50)) RETURNSINTEGER LANGUAGESQL DETERMINISTIC CONTAINSSQL SQLSECURITYDEFINER COMMENT'' BEGIN DECLAREvalueINTEGER; SETvalue=0; SELECTcurrent_valueINTOvalue FROMsequence WHEREname=seq_name; RETURNvalue; END $ DELIMITER;

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

DROPFUNCTIONIFEXISTSnextval; DELIMITER$ CREATEFUNCTIONnextval(seq_nameVARCHAR(50)) RETURNSINTEGER LANGUAGESQL DETERMINISTIC CONTAINSSQL SQLSECURITYDEFINER COMMENT'' BEGIN UPDATEsequence SETcurrent_value=current_value+increment WHEREname=seq_name; RETURNcurrval(seq_name); END $ DELIMITER;

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

DROPFUNCTIONIFEXISTSsetval; DELIMITER$ CREATEFUNCTIONsetval(seq_nameVARCHAR(50),valueINTEGER) RETURNSINTEGER LANGUAGESQL DETERMINISTIC CONTAINSSQL SQLSECURITYDEFINER COMMENT'' BEGIN UPDATEsequence SETcurrent_value=value WHEREname=seq_name; RETURNcurrval(seq_name); END $ DELIMITER;

 
第五步:测试函数功能
当上述四步完成后,可以用以下数据设置需要创建的sequence名称以及设置初始值和获取当前值和下一个值。
 

INSERTINTOsequenceVALUES(‘TestSeq’,0,1);—-添加一个sequence名称和初始值,以及自增幅度 SELECTSETVAL(‘TestSeq’,10);—设置指定sequence的初始值 SELECTCURRVAL(‘TestSeq’);–查询指定sequence的当前值 SELECTNEXTVAL(‘TestSeq’);–查询指定sequence的下一个值

 

 
在java代码中,可直接创建sql语句查询下一个值,这样就解决了流水号唯一的问题。
贴出部分代码(已测试通过)

publicvoidtestGetSequence(){ Connectionconn=JDBCUtils.getConnection(url,userName,password); Stringsql="SELECTCURRVAL('TestSeq');"; PreparedStatementptmt=null; ResultSetrs=null; try{ ptmt=conn.prepareStatement(sql); rs=ptmt.executeQuery(); intcount=0; while(rs.next()){ count=rs.getInt(1); } System.out.println(count); }catch(SQLExceptione){ e.printStackTrace(); }finally{ JDBCUtils.close(rs,ptmt,conn); } }

 
 
ps:在应用中,还有一种用java代码去实现模拟自增sequence的方式,具体思路是创建一张存放sequence的table,然后通过java调用sql语句去查询和修改这个table中指定sequence名称的值,这种方式请加上synchronized。具体代码这里就不上传了,因为实现了,未去测试过。

在oracle中,sequence提供多表多字段可共用一个不重复值。Mysql中存在自增列,基本可以满足PK的要求。但自增列存在限制:

a.只能用于表中的一个字段,一张不能同时存在两个上述就是数据库技术:在MySQL中创建实现自增的序列(Sequence)的教程分享的全部内容,如果对大家有所用处且需要了解更多关于mysql数据库学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/dtteaching/911612.html

(0)
上一篇 2021年10月25日
下一篇 2021年10月25日

精彩推荐