我用的是Oracle数据库。
现在有两个表,tabel1 和 tabel2
其中tabel1的ID是主键,tabel2的parid是外建关联tabel1的主键。
我想在删除tabel1前删掉tabel2里面的相关内容。
想通过触发器实现。自己做了一个触发器,如下:
(数据库名叫ora)CREATE OR REPLACE TRIGGER trig1
BEFORE DELETE
ON ora.tabel1
FOR EACH ROW
DECLARE
tmpVar NUMBER;BEGIN
tmpVar := 0; DELETE FROM tabel2 WHERE tabel2.parid=:OLD.ID;END ;
/
触发器可以顺利的创建
但是在执行语句
delete from tabel1 where id = 1
时报出异常:
ORA-04091: 表 ora.tabel2 发生了变化,触发器/函数不能读请问该怎么解决?
现在有两个表,tabel1 和 tabel2
其中tabel1的ID是主键,tabel2的parid是外建关联tabel1的主键。
我想在删除tabel1前删掉tabel2里面的相关内容。
想通过触发器实现。自己做了一个触发器,如下:
(数据库名叫ora)CREATE OR REPLACE TRIGGER trig1
BEFORE DELETE
ON ora.tabel1
FOR EACH ROW
DECLARE
tmpVar NUMBER;BEGIN
tmpVar := 0; DELETE FROM tabel2 WHERE tabel2.parid=:OLD.ID;END ;
/
触发器可以顺利的创建
但是在执行语句
delete from tabel1 where id = 1
时报出异常:
ORA-04091: 表 ora.tabel2 发生了变化,触发器/函数不能读请问该怎么解决?
如果有外键,级联删除可以不用触发器解决。--建立Foreign key constraint的之后指定on delete cascade
alter table <table_name> add constraint <constraint_name> foreign key on (<columns>) references <parent_table>(<columns>)
on delete cascade 你出现上面错误的原因是,可能原先的建表者已经通过外键实行级联删除了。
看一看
但是,如果你行trigger中显式引用了tabel1表就会报04091错误.不过你的这个trigger完全可以不用,简单的通过on delete cascade限制实现.
参考如下:
CREATE TABLE table1 (ID INT PRIMARY KEY,b INT);
CREATE TABLE table2 (ID INT PRIMARY KEY,parid INT REFERENCES table1(ID) ON DELETE CASCADE);
INSERT INTO table1 VALUES(1,1);
INSERT INTO table1 VALUES(2,2);
INSERT INTO table1 VALUES(3,3);
INSERT INTO table2 VALUES(1,1);
INSERT INTO table2 VALUES(2,2);
INSERT INTO table2 VALUES(3,3);
COMMIT;DELETE FROM table1 WHERE ID=1;
SELECT * FROM table2;
commit;
ALTER TABLE table2 ADD CONSTRAINT fk_t_parid FOREIGN KEY(parid) REFERENCES table1(ID) ON DELETE CASCADE;
要是如果有三个表。tabel3和tabel2也有这种主外键的关系。
那么在删除tabel1时可以将tabel3里的相关内容也删除吗?