alter table a drop cascade constraint
解决方案 »
- 动态执行视图强制创建语句 create or replace force view出现的问题
- 分区表上的索引问题
- 如何利用触发器避免重复插入数据
- 如何提交这些异动数据?
- oracle判断问题,答对马上就给分 在线
- 請問如何從ORACLE數據庫中將數據導入到SQL SERVER 2000數據庫?
- 请问那里有ORACLE DEVELOPER2000下载
- 怎样将一个table从一tablespace 搬到另外一个tablespace?有没有好办法??
- 基本概念:数据库服务、数据库实例?
- ORACLE中同时读取同一字段问题?
- 有没有办法在没有网卡的计算机上启动TNS
- 我在存储过程中的字符串 '这么表示?
--'ARCHFLIST' 就是我的子表,得出来的 FK_ARCHFLIS_REF_11545_ARCHF 就是这个外键约束,对吧!'alter table temp disable constraint FK_ARCHFLIS_REF_11545_ARCHF',是这样吗?多谢空杯大哥关照!
若还是不行,你就在程序里,在update主表的ID前后直接执行这两句SQL语句吧!
BEFORE UPDATE
ON XBDKMIS.ARCHF
FOR EACH ROW
DECLARE
oldID archf.docid%type;
newID archf.docid%type;
BEGIN
newID:=:new.docid;
oldID:=:old.docid;
if newID!=oldID then
execute immediate 'alter table archflist disable constraint FK_ARCHFLIS_REF_11545_ARCHF';
execute immediate 'update table archflist set docid=newID where docid=odlID';
execute immediate 'alter table archflist enable constraint FK_ARCHFLIS_REF_11545_ARCHF';
end if;
END;
执行修改操作的时候,出现如下错误:can't commit in trigger;
error during excute trigger;
...
好像没有什么好的解决办法。上面的办法也不行。可是这个表已经建立好了,这种效果看来在触发其中是不能达到的了。不止各位还有何高见?
SQL> create table a(id integer primary key);
Table created.-- 建子表
SQL> create table b(id integer);
Table created.--建立一个deferrable(可延时检验的外键,并设置初始校验方式为延时)
--这一部大概是最关键的,所谓延时校验就是在commit的时候才对约束进行合法性检查
--而建立约束的时候如果不指定延时校验那就是及时校验,dml完成以后立即进行合法性检查
SQL> alter table b add constraint fk_b_a foreign key (id) references a(id) deferrable initially deferred;
Table altered.--插入测试数据
SQL> insert into a values (1);
1 row created.
SQL> insert into a values (2);
1 row created.
SQL> insert into b values (1);
1 row created.
SQL> insert into b values (2);
1 row created.--建立一个触发器保证父子表中的纪录同步
SQL> create or replace trigger tri_a_1 before update on a for each row
2 begin
3 update b set id=:new.id
4 where b.id=:old.id;
5 end;
6 /Trigger created.--更新父表数据
SQL> update a set id=3 where id=1;
1 row updated.--检查结果
SQL> select * from a;
ID
----------
3
2--结果是看到子表中的纪录自动被更新了
SQL> select * from b;
ID
----------
3
2
CREATE OR REPLACE TRIGGER trg_update_father
AFTER UPDATE ON father FOR EACH ROW
BEGIN
UPDATE child SET id=:new.id WHERE
id=:old.id;
END trg_update_father;^_^>select * from father
2 ; ID
----------
1
2
3^_^>select * from child; ID
----------
SERIAL
----------------------------------------------------------------------------------------------------
1
hello 2
world 3
goodbye
^_^>update father set id=4 where id=1;已更新 1 行。^_^>select * from father; ID
----------
4
2
3^_^>select * from child; ID
----------
SERIAL
----------------------------------------------------------------------------------------------------
4
hello 2
world 3
goodbye