create trigger a_tri
before insert on a
for each row
declare
num number;
begin
select count(1) into num from a where userid=:new.userid;
if num>=5 then
delete from a where col_date in (select max(col_date) from a where userid=:new.userid);
end if;
end;
/

解决方案 »

  1.   

    create trigger a_tri
    before insert on a
    for each row
    declare
    num number;
    begin
    select count(1) into num from a where userid=:new.userid;
    if num>=5 then
    delete from a where col_date in (select max(col_date) from a where userid=:new.userid);
    end if;
    end;
    /
      

  2.   

    create trigger a_tri
    before insert on a
    for each row
    declare
    num number;
    begin
    select count(1) into num from a where userid=:new.userid;
    if num>=5 then
    delete from a where col_date in (select max(col_date) from a where userid=:new.userid);
    end if;
    end;
    /
      

  3.   

    最好是使用 view 的 instead of trigger 来实现
      

  4.   

    create table a_(dt date,n number);
    create view a as select * from a_;
    create or replace trigger trg_a
    instead of insert on a
    for each row
    declare
      cnt number := 0;
    begin
      select count(*) into cnt from a_;
      if cnt = 5 then
        update a_ set dt = :new.dt, n = :new.n
         where dt = (select min(dt) from a_);
      else
        insert into a_ values(:new.dt,:new.n);
      end if;
    end;
    /
    insert into a values(sysdate+1,1);
    insert into a values(sysdate+2,2);
    insert into a values(sysdate+3,3);
    insert into a values(sysdate+4,4);
    select * from a;
    insert into a values(sysdate+5,5);
    insert into a values(sysdate+6,6);
    select * from a;drop view a;
    drop table a_;
      

  5.   

    想问一下nyfor(nyfor):
    这样做有哪些好处呢??
      

  6.   

    to nyfor:
    你是说你那样写的话多用户并发的情况下不能正常工作吗?虽然我对oracle并不是特别熟悉,但是我想了解了解!!
      

  7.   

    谢谢你的回答,那如果用beckhambobo(beckham)的方法就不存在这个问题了吗?