比如登记一个商品的信息,
在oracle表中有个INFO表与它对应,要求程序登记界面有个框是显示 这个商品今天的流水号,比如如果是今天第一个商品,那就是2012-08-29-00001。如果有几台电脑一起登记的话,那其它电脑就分别显示2012-08-29-00002 ,2012-08-29-00003 ,2012-08-29-00004 等等,
问题还主要在于这个流水号不能中断,也不能重复。请问各位大侠这个问题如何解决。十分万分感激你们的回复!请赐教!
在oracle表中有个INFO表与它对应,要求程序登记界面有个框是显示 这个商品今天的流水号,比如如果是今天第一个商品,那就是2012-08-29-00001。如果有几台电脑一起登记的话,那其它电脑就分别显示2012-08-29-00002 ,2012-08-29-00003 ,2012-08-29-00004 等等,
问题还主要在于这个流水号不能中断,也不能重复。请问各位大侠这个问题如何解决。十分万分感激你们的回复!请赐教!
至于格式,程序里加上个日期不是难事吧。
第二:序列号不能重复,如果录入了一条信息,后来我觉得这条信息没有用,我把这条信息给删除了。那这样的情况怎么处理?
像这种ID的我们一般是这样处理,在点击新增按钮之后。调用一个存储过程,这个存储过程做两件事,第一:获取当前表中的最大的ID,在原来的基础上加1,第二:把传进来的参数一一对应到表字段进行新增。
每次记录的时候取当天最大后缀,然后+1
with tb(id) as
(select '2012-08-29-00001' from dual union all
select '2012-08-29-00002' from dual union all
select '2012-08-29-00003' from dual union all
select '2012-08-29-00004' from dual)
select to_char(sysdate,'YYYY-MM-DD')||'-'||lpad(nvl(max(substr(id,12)),0)+1,5,'0')
from tb where substr(id,0,10)=to_char(sysdate,'YYYY-MM-DD')
将上面select出来的id作为新id插入即可。
with tb(id) as
(select '2012-08-29-00001' from dual union all
select '2012-08-29-00002' from dual union all
select '2012-08-29-00003' from dual union all
select '2012-08-29-00004' from dual)
select to_char(sysdate,'YYYY-MM-DD')||'-'||lpad(nvl(max(substr(id,12)),0)+1,5,'0')
from tb where substr(id,0,10)=to_char(sysdate,'YYYY-MM-DD')
能满足LZ的需求
谢谢ershihaidao的回复,在能实现的基础上尽量能人性化是最好,但不能实现那也是没方法,这个序号肯定做不到连续,但一天如果缺少几条那就说明删了几条,这个也没什么影响,但是就是这样,实现起来还是有难度。请大家多点给意义想法
利用序列应该可以实现,
下面是我自己的思路(没有利用序列)
整张表计数 2字段 (里面要有一条记录--你懂的)
create table t_count(
counter number(10),--一个负责累加
change_time date)--记录变更的时间
-----------------------
update t_count set counter =
(select nvl((select counter from t_count where to_date(sysdate)= to_date(change_time)),0)+1 from dual)
and change_time=sysdate
---------------------------------
insert tb(id ) values(
select to_char(sysdate,'YYYY-MM-DD')||'-'||lpad(select counter from t_count,5,'0') from dual)
select to_char(sysdate,'YYYY-MM-DD')||'-'||lpad((select counter from t_count),5,'0') from dual)
少了对括号……