现有3个表 
A (A_id int PRIMARY KEY,name char(2)), 
B (ID INT PRIMARY KEY,A_ID INT  REFERENCES A(A_id)); 
C (ID INT PRIMARY KEY,A_ID INT  REFERENCES A(A_id));
目前的这种约束是,B,C 表的外键是A表的主键,但是想满足的需求是:必须保证A,B,C三个表中的数据一致,即写入时必须三个表都写入,删除时必须三个表都删除! 而目前的主外键约束明显满足不了(因为insert时有可能只insert了A表,delete时只delete了B或C),请教高人,在oracle里有没有其它的约束能满足这个需求?

解决方案 »

  1.   

    先 声明 主外键并不能完成 所谓的同步,他只是一种表名依赖关系的东东。
    你这样的要求,一般都会求助于程序层 来控制实现。你非要数据库来实现可能会觉得有些繁琐和麻烦。
    但是数据库层也可以实现:具体思路如下:代码你也许需要修改一下才能用
    建立三个触发器来完成你想要的结果-----------------------------------
    create or replace trigger z_insert
      before insert on A
      for each rowbegin
      insert into b (b_ID) values :new.a_id;
      commit;
      insert into c (c_id) values :new.a_id;
      commit;end z_insert;------------------------create or replace trigger z_no_delete before delete, update on b for each rowbeginIf DELETING then delete A where a_id = :new.b_id;
    commit;delete b where b_id = :new.b_id;
    commit;if updating then  update a set a_id = :new.b_id;
      commit;  update b set b_id = :new.b_id;
      commit;end z_no_delete;-------------------------------create or replace trigger z_no_delete_on_c before delete, update on b for each rowbeginIf DELETING then delete A where a_id = :new.b_id;
    commit;delete c where c_id = :new.c_id;
    commit;if updating then  update a set a_id = :new.b_id;
      commit;  update c set c_id = :new.c_id;
      commit;end z_no_delete_on_c;以上只是个思路。如果真要拿来用,自己要对应修改以后才行。另外:建议这个事情不要让数据库层来完成。