大家好。 我现在有一个序列和触发器(如下),不知道为什么序列号不会自动更新。例如,我第一次创建5条记录(id将会是1--5),但当我把他们全部删除,再建5条,第一条记录的id却从6开始。请问怎么解决这个问题。谢谢指教!!!!序列:
DROP SEQUENCE SCOTT.SEQ_MEMEBER;CREATE SEQUENCE SCOTT.SEQ_MEMEBER
  START WITH 11
  MAXVALUE 99999999
  MINVALUE 1
  CYCLE
  NOCACHE
  NOORDER;触发器:
CREATE OR REPLACE TRIGGER SCOTT.TRIGGER_MEMBER
BEFORE DELETE OR INSERT OR UPDATE
ON SCOTT.MEMBER
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
WHEN (
new.id is null
      )DECLARE
tmpVar NUMBER;
BEGIN
   tmpVar := 0;   SELECT seq_memeber.NEXTVAL INTO tmpVar FROM dual;
   :NEW.id := tmpVar;   EXCEPTION
     WHEN OTHERS THEN
       -- Consider logging the error and then re-raise
       RAISE;
END trigger_member;
/

解决方案 »

  1.   

    sequence就是这样递增的.你这个程序可改为这样实现(不使用sequence):
    CREATE OR REPLACE TRIGGER SCOTT.TRIGGER_MEMBER 
    BEFORE INSERT 
    ON SCOTT.MEMBER 
    REFERENCING NEW AS New OLD AS Old 
    FOR EACH ROW 
    DECLARE 
    tmpVar NUMBER; 
    BEGIN 
      tmpVar := 0;   SELECT NVL(MAX(id),0) INTO tmpVar FROM SCOTT.MEMBER; --取上次最大值,NVL用于第一次插入的判断。
      :NEW.id := tmpVar+1; --加1  EXCEPTION 
        WHEN OTHERS THEN 
          -- Consider logging the error and then re-raise 
          RAISE; 
    END trigger_member; 
     
      

  2.   

    但象我上面这样写,会存在并发问题.还有一办法就是sequence清零了.
      

  3.   

    oracle 的序列就是这个特性。及时你删除了记录,但序列不会退回原始记录,除非alter 序列。1、如楼上说的,重建序列。
    2、修改序列。
    3、查询当前序列CURRVAL,然后可以使用的数范围 0~序列.CURRVAL ,不过用完后需要跳过这个当前值,否则会报错。这个比较麻烦。
    4、不用序列,用一变量控制。
      

  4.   

    1.序列在其未循环之前一直是往前加的。如果你一定从1开始,另用一个新的SEQUENCE;
    2.继续使用SCOTT.SEQ_MEMEBER也无碍程序。