实现在写Insert的时候,不需要给Id赋值,数据库自动会+1

解决方案 »

  1.   

    delcare  
      n_id number(10);
    beginSELECT SEQ_RESOURCE.NEXTVAL INTO N_ID FROM DUAL;insert table (id,..)
           values(n_id,..)
    end;
      

  2.   


    CREATE SEQUENCE a.SEQ_ID START WITH 1 INCREMENT BY 1 MAXVALUE 1E30 NOCYCLE NOCACHE;CREATE OR REPLACE TRIGGER a.TRIG_a_ID
    BEFORE INSERT ON a.a
    FOR EACH ROW
    BEGIN
      IF (:NEW.ID IS NULL) THEN
        SELECT SEQ_ID.NEXTVAL INTO :NEW.ID FROM DUAL;
      END IF;
    END;
    /
      

  3.   

    create sequence myid start with 1 increment by  1 maxvalue 9999999999 nocycle;
    insert into x value(myid.nextval);
      

  4.   

    先建立一个序列,然后通过触发器在insert时把序列值插入到表里
    至于具体操作,前面高手都说了
      

  5.   

    我的方法不知道好不好仅供参考。
    建立一个存储主键值的表,结构如下表名   字段名     主键当前值
    tab1   col1        132
    tab2   col2        2568每次往表里插值时,先去查询该表的主键当前值,插完值后再将当前值+1更新回去。
    例如:tab1里记录的最大值是131,主键表里的值是132
    insert into tab1 (col1) value (select 主键当前值 where 表名 = tab1 and 字段名 = col1);
    update 主键表 set 主键当前值 = 主键当前值+1 where 表名 = tab1 and 字段名 = col1;这种方法比序列便于管理对于表很多的情况来说,取主键值,和更新主键值可以做一个通用的方法,只需传入参数(表名,字段名)即可,这样使用起来更便捷
      

  6.   

    支持joze(joze)的方法, 实际项目就是这么用的, 效果很好, 便于维护, 当需要导数据库时很方便, 发现序列有问题只要修改sequence表中的值即能通步
      

  7.   

    使用sequence的唯一缺点是存在跳号
    因为.nextval只能去一次,如果不用,下次再取就+1了
    解决办法:
    取Max(ID)+1
      

  8.   

    那问个问题哦,如果很多个表,每个表都建一个自动增长ID的话,是不是也要建那么多个sequemce呢?
      

  9.   

    通过序列实现,
    create sequence id start with 1 increment by  1 maxvalue 9999999999 nocycle;
    insert into xxx value(id.nextval);