字段类型设为idetity。
或是在程序里控制加一。
取得新记录的编号:
select max(seg)...

解决方案 »

  1.   

    编号通过存储过程来控制比较好,如果要满足你的要求,通常会用一段sql来取得:
    比如编号格式为YYYYMMDDXXX
    select max(to_number(mid(id,9))) into tempid
      from mytbl
     where id like to_char(sysdate, 'yyyymmdd') || '%';
    if tempid > 999 then   --溢出控制
      raise_application_error('编号溢出');
    else
      tempid := tempid + 1;
    end if;
    ...
      

  2.   

    用ycjnx(叮铛)的作法在多用户时可能会有问题,除非你锁定这个表,直到取出seg 值。
    否则在取max(seg)之前,若有其他用户也加入新记录,取出来的是别人的 seg .
      

  3.   

    若日期唯一的话.可以这样.
    select  rowid=(select rowid=count(*),datefield from mytable t1 where t1.datefield<t2.datefield) ,* from mytable t2
      

  4.   

    我用过两种方法:
    1。单独建一个编码资源表来保证并发访问的正确
    2。利用触发器,加一个idetity,然后再建一个id列,字符型,加insert trigger 来维护id实现:0001的样子
      

  5.   

    谢谢大家的参与这里的编号是个广泛地概念,不一定是日期,但共同点是唯一,具有流水号性质,在已有最大的编号基础上加1,用来唯一标识一条记录。我想大家都有自己的实现方法,我是在想怎样做才是比较好的做法,安全、可靠、效率高。比如采用select max()的方法,我想如果记录数庞大,是不是比较浪费时间呢!我采用过将下一次要用的新的编号保存在一个小表中,但这样并发控制还是有问题,但觉得比select max好,因为我不需要每次执行这条语句了。另外关于采用自增加id字段,我觉得相当不好,主要是不好控制!
      

  6.   

    我觉得用自增加ID没什么不好,只是需要有自己的编码规则时不好处理。
    其实上面说的都没什么不好,关键就是并发控制的问题。若不用自增加ID,在输入记录时不要生成新编号(可以生成一个新编号,但只给用户看看而已),到真正在数据库中insert 时再取max +1 生成新编号,能添加成功就可以了,若不成功可能是有其他用户抢号,可以重新取号重试一下,一般没什么问题。
    不太喜欢用编号表,不好维护,编号表很容易与真实记录不一致。
      

  7.   

    建一编号表 tabel1 (id_name,id_value)用下列过程可解决并发控制的问题CREATE PROCEDURE nextno
    @name int,@last int(10) output  
     AS
    set nocount on
    begin tran
       update table1 set id_value=id_value+1 WHERE id_name =@name
       SELECT @last=id_value FROM His_prm  WHERE id_name =@name
    commit tran 
      

  8.   

    错了:
    应该
    CREATE PROCEDURE nextno
    @name int,@last int output  
    AS
    set nocount on
    begin tran//开始锁定记录,确保取值唯一  update table1 set id_value=id_value+1 WHERE id_name =@name
      
      SELECT @last=id_value FROM His_prm  WHERE id_name =@name//结束锁定commit tran 
     
      

  9.   

    又错了!(气死我了)CREATE PROCEDURE nextno
    @name int,@last int output  
    AS
    set nocount on
    begin tran//开始锁定记录,确保取值唯一  update table1 set id_value=id_value+1 WHERE id_name =@name
      
      SELECT @last=id_value FROM table1  WHERE id_name =@name//结束锁定commit tran