有两张表,A表、B表。
我要写一个触发器,当A表写入数据时判断“如果A表的ID值在B表中有记录,则数据就不写入A表,放弃写入”。请大家帮忙帮忙

解决方案 »

  1.   

    下面有个例子,你可以试试。
    create or replace trigger tri_B_id
    after insert or update on B
    for each row
    declare
      c_cnt int;
    begin
       select count(*) into c_cnt from t1 where id = :NEW.id;
      If c_cnt >0
      then
         raise_application_error(-20000,'The ID is existing!');
      end if;
    end;
      

  2.   

    1. 外键约束是最佳方法.
    2. oracle是不推荐在trigger里面写逻辑判断的,影响性能. 使用select count(*)判断的方法不太好,与其这样还不如直接insert产生主键冲突然后抛出异常.
      

  3.   

    1. 用外键约束?
    在我的印象中,外键约束是指子表中的某列的值必须在主表的某列中存在,好像没有说子表中的某列的值不在主表的某列中存在的情况。不清楚在这个问题上如何用外键约束?有人能给一个例子吗?2. 楼上用before insert?
     重写列应该用before, 但是拒绝插入应该是after吧?3.oracle是不推荐在trigger里面写逻辑判断的,影响性能. 使用select count(*)判断的方法不太好,与其这样还不如直接insert产生主键冲突然后抛出异常.
     这个说法是有疑问,首先我们不确定ID是否主键,其次这个问题不会产生"insert产生主键冲突然后抛出异常"这种情况,因为即使ID是主键,在没有主键冲突的情况也可能拒绝插入。
      

  4.   

    查了下资料,发现如果要重写列必须用before,要做拒绝插入和别的操作既可以用before也可以用after。