一个关于插入、删除的触发器问题(不需要更新)。注:  QUOTE_ID,NO是PRIMARY KEY
我的QUOTE表查询后如下表:能不能创建一个触发器,具有如下功能.当插入一条记录时,NO自动填上序列:1、2、3、4等等.  QUOTE_ID         NO   NAME                                              
---------- ----------   -------
      3546          1    AAA                                               
      3546          2    BBB                                               
      3546          3    CCC                                               
      3546          4    DDD                                               
      3547          1    EEE                                               
      3547          2    FFF                                               
      3547          3    GGG                                               
      3547          4    HHH                                               
当删除一条记录时,NO列自动重新排列。
例如,上一个表删除一条记录后,变成下面这个表。
  QUOTE_ID         NO   NAME                                              
---------- ----------   -------
      3546          1    AAA                                               
      
      3546          2    CCC                                               
      3546          3    DDD                                               
      3547          1    EEE                                               
      3547          2    FFF                                               
      3547          3    GGG                                               
      3547          4    HHH                                               

解决方案 »

  1.   

    如果NO是NUMBER型的.
    create or replace trigger new_tri
    before insert on QUOTE
    begin
    select max(no)+1 into :new.no from QUOTE
    where QUOTE_ID=:new.QUOTE_ID;
    end;create or replace trigger new_tr
    after delete on QUOTE
    declare   
    begin
    update QUOTE
    set no=no-1
    where QUOTE_ID=:old.QUOTE_ID
    and no>old.no;
    end;
      

  2.   

    楼上的漏了一句,而且没有这句,这两个触发器根本不能执行.
    另外还要考虑第一次插入记录的情况.
    create or replace trigger new_tri
    before insert on QUOTE
    for each row --表示是行级触发器
    declare 
    t_no number;
    begin
    select count(*) into t_no from QUOTE where QUOTE_ID=:new.QUOTE_ID;
    if t_no>0 then 
    insert into QUOTE_ID(NO) 
    select max(no)+1 from QUOTE
    where QUOTE_ID=:new.QUOTE_ID;
    else
    insert into QUOTE_ID(NO) values(1);
    end if;
    end;
    create or replace trigger new_tr
    after delete on QUOTE
    for each row  
    begin
    update QUOTE
    set no=no-1
    where QUOTE_ID=:old.QUOTE_ID
    and no>:old.no;
    end;