作者swpoker (swpoker)
看板java
标题Re: [问题] 关於资料库流水号的问题
时间Wed Jan 13 15:26:14 2016
分享自己的流水号的方式
资料库:oracle
流水号=时间+流水号
1.建置系统前
建立流水号表格或sequence(我是用流水号表格的方式)
并建立第一笔资料
2.系统执行时,利用SQL查询
----独立交易开始
select seq,min,max,sysdate from 流水号设定档 for update
首先获得seq,及sysdate
然後先回写下一个seq
seq= (++seq) > max ? min : seq;
update回去
commit
---独立交易结束
4.将获得seq及sysdate,变成流水号
例如
format(sysdate,'yyyyMMddHHmmsss')+seq
或是
直接getTime()+seq
都可以
*.重号的条件为在时间的规则下,超过max的要求
例如format(sysdate,'yyyyMMdd'),max为10
则每天的取号超过10的话,就会重复
*.此取号的字串的长度几乎是有限制的
*.我自己是为了限制长度
例如 时间规则到秒,max=100000,根据自己写的公式
则流水号为 1F5sfd8001467 , 永远固定13码
如一秒超过100000的取号,则会重复
提供给你参考
※ 引述《SHANGOYANYI (彦一)》之铭言:
: ※ 引述《u9423504 (缘投农夫)》之铭言:
: : 各位前辈好:
: : 小弟使用的资料库是Oracle。想请教各位,如何产生以当天日期为主的流水号,而且
: : 日期每过一天,流水号的编号就从01开始编起。例如:15121301、15121302
: : 、15121303、15121401、15121402等。其中,『15』表示是西元2015年。
: : 其流水号格式为:yymmdd+2码的流水号。而且要避免线上多人同时Insert资料时产生
: : 重覆的编号。且该流水号的资料栏位格式是Varchar。
: : 小弟目前想到的方法是:以当天的日期加上like 和 count 去做 select,若都没有找
: 到
: : 则日期补上01;若有找到,则日期前加上
: : count回传的笔数+1。
: : 不知是否有更好的方法呢?!
: 这题把日期跟流水号分两栏存就很好做了
: 建一个before insert trigger自动去找当天日期的流水号栏位max值 +1 设为new value
: 再加个date+seq的unique条件即可~
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 42.73.54.155
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1452669978.A.5B0.html