现有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里有没有其它的约束能满足这个需求?
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里有没有其它的约束能满足这个需求?
解决方案 »
- Oracle中如何查询第10条记录???
- 一个扫qlplus调用存储过程(带参数)的问题
- DBA_JOBS 定时操作只运行一次,不知为啥
- 如何把oracle 9i 里的某个表 导出到SQL server 2000 里呢? 包括表结构和数据
- execute immediate执行sql问题
- 我要在我的机器上学习Oracle,是不是必须服务器端和客户端两个软件都装上?
- 关于ORACLE 分区表
- 在VB.net中如何去除从Oracle数据库中取出的Varchar字符串的空格?
- minus是什么意思?是个函数吗?怎么用?
- []请教个Oracle ODAC,Client,VS2010的问题
- 求教:关于在Oracle的存储过程中动态调用函数并获取返回值的问题
- Oracle Internet Directory ( oracle ldap ) 高手请进
你这样的要求,一般都会求助于程序层 来控制实现。你非要数据库来实现可能会觉得有些繁琐和麻烦。
但是数据库层也可以实现:具体思路如下:代码你也许需要修改一下才能用
建立三个触发器来完成你想要的结果-----------------------------------
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;以上只是个思路。如果真要拿来用,自己要对应修改以后才行。另外:建议这个事情不要让数据库层来完成。