我知道oralce自动编号这个字段需要建立一个序列,然后每次在insert的时候需要调用这个字段
create sequence SQID minvalue 1 maxvalue 999999999999999999999999999 start with 1 increment by 1insert into operator_op(operatorid,operatorname,password_pa,groupingid) values(SQID.NEXTVAL,'mmm','234','1')那么有没有什么办法在insert的时候不调用这个序列而使数据库自动编号呢?就好像sql server那样,我知道用触发器可以做到,但是在不方便用触发器的时候呢?先建一个序列:
   CREATE sequence seq_for_insert
     minvalue 1 
     start with 1 
     increment by 1 
     nocache;再建一个trigger:
CREATE or replace trigger Trig_for_insert
before insert on TableName
for each row 
   
BEGIN 
   select seq_for_insert.nextval into :new.ID from dual;
END;就是说有没有通用一点的办法,我记得好像字段有个什么默认值,可不可以在默认值里写上我的序列而使它自动编号呢?还有一个问题,建一个表就需要一个序列,(如果上一个表的序列是100,那么下一个表再调用的时候就是101了)怎么能做到一个序列对应好多表呢?请高手赐教了,小弟不胜感激~~

解决方案 »

  1.   

    我是这么想的因为序列本身并不保存表的内容,也就是序列本身就是初始值,最大值,每次增加值。所以不管哪张表调用这个序列,都应该是从初始值开始的。但是我刚才作测试的时候,发现上一个表调用序列到了100,第二张表再调用同一个序列的时候,自动编号变成了101,
    insert into operator_op(operatorid,operatorname,password_pa,groupingid) values(SQID.NEXTVAL,'mmm','234','1')
    这样调用的,请问是我调用的方式问题还是在什么地方有错误?
    它为什么会记录了上一张表的自动编号内容?
      

  2.   

    序列本身就是一个独立的object,并不是它记录了上一张表的自动标号内容,应该反过来说:是上一张表调用了这个对象的nextval方法(soid.nextval) 获得一个值 只不过这个值和soid本身所保存的一样罢了。跟表没有关系的,比如:
    select soid.nextval from dual;每运行一次soid的值就加一至于:有没有什么办法在insert的时候不调用这个序列而使数据库自动编号呢?就好像sql server那样,大可不必深究,意义不大。用序列就好了