再开Struts发过程中遇到一个编号自动生成的问题,甚是头疼,编号规则如下:系统当前日期+教师编号+自动增长的编号(date+teancherid+id),在每个教师提交报告时将自动生成的编号一并提交到数据库,问题主要出在后面自动增长的编号(id)上,要求教师每提交一个报告,编号自动加一,本人实在不知道把这个自动增长的操作写在什么位置,写在ActionForm中肯定不行(每次都回被重置),后来尝试取出当前登录教师曾经提交的纪录条数然后加1,但是后来发现,如果删除纪录后再提交会出现编号重复的问题,实在想不出好的办法,请高手帮忙!

解决方案 »

  1.   

    id 是针对每个老师还是针对所有的都采用同一个id?
    采用同一个id:可以考虑保存在文件里;如果采用静态变量,系统重启就没了.
    采用不同的id: 获取max(date+teancherid+id);写一个静态方法,使得id +1 就ok.
      

  2.   

    如果是针对每一个老师,则就是在用这种方式:
    采用不同的id: 获取max(date+teancherid+id);写一个静态方法,使得id +1 就ok.具体点说就是:
    1.select max(编号) as a where teancherid = ?;
    2.针对得到的编号处理 b ;
    假设:date+teancherid+id 为 20060804 0001 88
    针对a,写一个静态方法得到 id, id+1则就是新自动增长的编号;
    3.最终编号则就是currentdate + teancherid + b;希望对你有所帮助;
      

  3.   

    2.针对得到的max(编号)处理 而得到b ;
      

  4.   

    您的意思是将20060804000188在数据库中存成bigint?溢出了吧?
      

  5.   

    不好意思,问个弱智问题那个as a 是什么意思啊
      

  6.   

    系统当前日期+教师编号+自动增长的编号(date+teancherid+id)?
    不是这样的吗?
    我是根据你提供的信息来做的编号;如果数据量很大,建议采用number或者varchar.
      

  7.   

    那个a 是什么? 还有max()只能对数字进行操作,20060804000188到底应该存成什么类型,请解释一下,谢谢,我是新手,别嫌我烦啊:)
      

  8.   

    as a 就是所取出的列名称叫做a   例如select select max(编号) as a 会得到================
           a
    ================
           1
    ----------------
           2
    -----------------
      

  9.   

    有两种方法。一种另定义单独的sequence表。这个表的功能只是记录相应教师的最大id号。另一种是在原来这个表里增加这个id字段,每次保存进去。下一条记录直接取出max(id)+1。就是你要的东东了这样就不会出现重复了。
      

  10.   

    根kongxiangli(笑看红尘0)一样啊,得对数据库操作两次,个人感觉效率低:)
      

  11.   

    max+1 是正解。
    项目中广泛使用。
      

  12.   

    但是20060804111101这样的数字怎么存到数据库阿,没法max()阿