我的触发器需要帮助。我在Oracle中执行触发器,在第一个表中删除行,外国人键引用第二个表,其中删除了主键,其值为第一个表中的外键。
我有这些表格:
CREATE TABLE Room (
id_room NUMBER(5) NOT NULL,
.
.
price VARCHAR(10) NOT NULL,
PRIMARY KEY(id_mistnosti),
);
CREATE TABLE item1 (
id_room NUMBER(5) NOT NULL,
.
.
FOREIGN KEY(id_room) REFERENCES Room
);
CREATE TABLE item2(
id_room NUMBER(5) NOT NULL,
.
.
FOREIGN KEY(id_room ) REFERENCES Room
);
我有桌子,有2个项目,所以当我删除他们的房间时我需要删除这两个项目。
现在我尝试只删除一个项目:
CREATE OR REPLACE TRIGGER removeRoomsItems
BEFORE DELETE ON Room
FOR EACH ROW
WHEN (:Room.id_mistnosti = :item1.id_mistnosti)
BEGIN
DELETE FROM item1;
END;
/
我的SQLdeveloper写道错误在WHEN条款中。 我需要一些指南来删除这两个项目。
答案 0 :(得分:2)
触发器中的表达很糟糕。触发器可能如下所示:
CREATE OR REPLACE TRIGGER removeRoomsItems
BEFORE DELETE ON Room
FOR EACH ROW
BEGIN
DELETE FROM item1 WHERE id_room = :old.id_room ;
END;
在pl / sql函数中,不要使用 WHEN ,而是使用 IF , ELSE 和 END IF ;
但是你不需要这个触发器,使用级联FK,所以你需要这样创建表:
CREATE TABLE item2(
id_room NUMBER(5) NOT NULL,
.
.
FOREIGN KEY(id_room ) REFERENCES Room ON DELETE CASCADE;
);
永远不要使用这样的触发器,这是非常糟糕的方式。
答案 1 :(得分:0)
在这种情况下,您不需要任何触发器
只需使用ON DELETE CASCADE
子句:
http://docs.oracle.com/cd/B19306_01/server.102/b14200/clauses002.htm
ON DELETE子句
ON DELETE子句允许您确定Oracle的方式 如果删除a,数据库会自动维护引用完整性 引用主键或唯一键值。如果你省略这个条款,那么 Oracle不允许您删除引用的键值 在子表中具有从属行的父表。如果希望Oracle删除相关外键,请指定 CASCADE 值。
如果希望Oracle转换从属外键,请指定 SET NULL 值为NULL。
见这个简单的例子:
CREATE TABLE Room (
id_mistnosti int,
id_room NUMBER(5) NOT NULL,
price VARCHAR(10) NOT NULL,
PRIMARY KEY(id_mistnosti)
);
CREATE TABLE item1 (
id_room NUMBER(5) NOT NULL,
item_name varchar(100),
FOREIGN KEY(id_room) REFERENCES Room ON DELETE CASCADE
);
CREATE TABLE item2(
id_room NUMBER(5) NOT NULL,
item_name varchar(100),
FOREIGN KEY(id_room ) REFERENCES Room ON DELETE CASCADE
);
insert into room values( 1, 1, 100 );
insert into room values( 2, 2, 200 );
insert into item1 values( 1, 'room 1' );
insert into item1 values( 1, 'room 11' );
insert into item1 values( 2, 'room 2' );
insert into item1 values( 2, 'room 22' );
insert into item2 values( 1, 'room 1' );
insert into item2 values( 1, 'room 11' );
insert into item2 values( 2, 'room 2' );
insert into item2 values( 2, 'room 22' );
commit;
现在:
SELECT * FROM item2;
ID_ROOM ITEM_NAME
---------- ----------
1 room 1
1 room 11
2 room 2
2 room 22
删除房间并查看此删除对项目的影响:
delete from room where id_mistnosti = 1;
select * from item2;
ID_ROOM ITEM_NAME
---------- ----------
2 room 2
2 room 22