表A(
id number primary key,
hitnum number, --使用次数
type char(10)--类型
)
表B(
id munber,--标识
type char(10),类型
num nmber,--总使用次数,为A表中同一类型的使用次数总和
totalNum number,--为A表中同一类型的记录数量
)在oracle中怎样建立触发器可以使往A表中增删改数据都让B中的记录与A同步,并且每次更新使系统开销尽可能小(A表中可能有同万条记录)。根据实际情况,B不能用创建视图的方案代替,在这只能用触发器了,请教各位!

解决方案 »

  1.   

    drop table A;
    create table A(
    id number primary key,
    hitnum number,
    type char(10)
    );create sequence seq_A start with 1;create table B(
    id number,
    type char(10),
    num number,
    totalnum number
    );create or replace trigger trig_A 
    after delete or insert or update  on A
    for each row
    declare
      v_count integer;
    begin
      if deleting then
      begin
        update B set B.num = B.num - :old.hitnum, b.totalnum = b.totalnum -1
        where b.type = :old.type;
        
        delete from b where b.num = 0 and b.totalnum = 0;
      end;
      elsif inserting then
      begin
        select count(*) into v_count from b where type = :new.type;
        if v_count = 0 then
          insert into b(type,num,totalnum) values(:new.type,:new.hitnum,1);
        elsif v_count = 1 then
          update B set B.num = B.num + :new.hitnum, b.totalnum = b.totalnum + 1
          where b.type = :new.type;
        end if;
      end;
      elsif updating then
      begin
        update B set B.num = B.num + :new.hitnum - :old.hitnum
        where b.type = :new.type;
      end;
      end if;
    end;
      

  2.   

    对你的表B的结构不是很清楚,没有主键?每次表A有操作了,都是insert into 表B?还是会更新?更新的话,假如id是主键,那岂不是永远都是1?假设前提:
    都是更新表B.不是INSERT ONLY的那种。(等于说表B里面id是起到主键的作用)CREATE TRIGGER 表A_TRIG
        AFTER INSERT OR UPDATE OR DELETE
        ON 表A
        FOR EACH ROW
        BEGIN
          IF INSERTING THEN
            INSERT INTO 表B VALUES(:NEW.id,:NEW.type,:NEW.hitnum,1);
          ELSIF UPDATING THEN
            UPDATE 表B SET num = num + :NEW.hitnum WHERE ID =:NEW.id;
          ELSIF DELETING THEN
            DELETE FROM 表B WHERE ID =:NEW.id;
          END IF ;
        END ;只是INSERT的话:CREATE TRIGGER 表A_TRIG
        AFTER INSERT OR UPDATE OR DELETE
        ON 表A
        FOR EACH ROW
        BEGIN      INSERT INTO 表B 
          SELECT ID,MAX(TYPE),SUM(hitnum),COUNT(1)
          FROM 表A
          WHERE ID = :NEW.id
          GROUP BY ID;    END ;类似这样?