比如登记一个商品的信息, 
在oracle表中有个INFO表与它对应,要求程序登记界面有个框是显示 这个商品今天的流水号,比如如果是今天第一个商品,那就是2012-08-29-00001。如果有几台电脑一起登记的话,那其它电脑就分别显示2012-08-29-00002 ,2012-08-29-00003 ,2012-08-29-00004 等等,
问题还主要在于这个流水号不能中断,也不能重复。请问各位大侠这个问题如何解决。十分万分感激你们的回复!请赐教!

解决方案 »

  1.   

    建个序列呗,每天晚上12点整定时跑个job把它重置一下。
    至于格式,程序里加上个日期不是难事吧。
      

  2.   

    你的这个想法就有问题。第一:如果我三台电脑同时录入信息,而系统自动给三台电脑分配了一个ID,然后有两台电脑退出了录入界面。只有第三台录入了信息。那请问这个ID怎么传?
    第二:序列号不能重复,如果录入了一条信息,后来我觉得这条信息没有用,我把这条信息给删除了。那这样的情况怎么处理?
    像这种ID的我们一般是这样处理,在点击新增按钮之后。调用一个存储过程,这个存储过程做两件事,第一:获取当前表中的最大的ID,在原来的基础上加1,第二:把传进来的参数一一对应到表字段进行新增。
      

  3.   

    id 设成Primary Key 效果(not null 、唯一)
    每次记录的时候取当天最大后缀,然后+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插入即可。
      

  4.   

    就像他们前面说的,如果发现错误数据,需要删除,则序列号就不可能连续了。无论是用序列或者取max值+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')
    能满足LZ的需求
      

  5.   


    谢谢ershihaidao的回复,在能实现的基础上尽量能人性化是最好,但不能实现那也是没方法,这个序号肯定做不到连续,但一天如果缺少几条那就说明删了几条,这个也没什么影响,但是就是这样,实现起来还是有难度。请大家多点给意义想法
      

  6.   

    -----实际就是要整个可以记录当天最新的id(可能已经被删除,即已经有过,后面的记录不可用)
    利用序列应该可以实现,
    下面是我自己的思路(没有利用序列)
    整张表计数 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)
      

  7.   

    insert tb(id ) values(
    select to_char(sysdate,'YYYY-MM-DD')||'-'||lpad((select counter from t_count),5,'0') from dual)
    少了对括号……
      

  8.   

    序列+日期字段:你说的这个ID用sequences,+1自增长,显示的时候,用你的时间字段(这个在数据表中应该有吧,就是你插入数据的日期)转换成字符串形式再拼接上你的ID,这样不就可以了吗,绝对不会有断号或重复。